Gå til innhold

Er det en metode for å fjerne 60k linjer i en tekstfil?


Oknok

Anbefalte innlegg

Hvis man vil fjerne tusenvis av linjer i en tekstfil, og alle linjene jeg vil fjerne er unike, men de har noen ord til felles, hvordan gjør man?

 

F.eks har jeg en tekstfil med 65000 linjer. Jeg ønsker å samle visse linjer med relevant informasjon for akkurat det jeg ser etter. Men den informasjonen drukner da 95% av linjene er uten interesse i denne sammenhengen.

 

Verktøyene jeg har til rådighet er Notepad, Notepad++, Wordpad, diverse nettlesere. Ikke den mest imponerende verktøykassen, jeg vet.

 

Lenke til kommentar
Videoannonse
Annonse
2 minutes ago, Salvesen. said:

Vanskelig å si uten mer info, men jeg hadde nok matet det igjennom noe C# kode

Jeg har hørt om C# og nå har jeg sagt alt jeg vet om C#.

Håpet Notepad++ hadde en metode som kunne brukes. Jeg har ca en halvtimes erfaring med Notepad++ og har ikke oversikt over hva det kan gjøre.

 

Det er ikke så mye å vite om dette. Bare at det er mange tusen linjer og jeg ønsker å fjerne alle som har enkelte ord til felles.

Kunne også gjort det den motsatte veien og kun søkt etter linjer som har data jeg er interessert i, men jeg er ikke sikker på hva alle søkeordene er. Det virker da lettere å angripe det med å fjerne ting som er i veien.

 

Lenke til kommentar
12 minutes ago, likferd said:

La meg introdusere deg til Regex

Takk for forslaget. Men det er en funksjon for å erstatte det som blir funnet med noe annet.

Det jeg trenger er noe annet. Hvis en linje inneholder f.eks POSITION pluss en masse annet, ønsker jeg å slette *hele den linjen*.

 

Endret av Oknok
Presisering
Lenke til kommentar
9 minutes ago, Oknok said:

Takk for forslaget. Men det er en funksjon for å erstatte det som blir funnet med noe annet.

Nei, regexp er ein måte for å matche tekst.

^.*test.*$ vil matche alle linjer som inneheld ordet test. Om du då erstatter dei med ingenting så har du fjerna dei. ^ matcher start of line, . er any character, * er null eller fleire av forrige, test er rett fram, $ er end of line.

Endret av barfoo
  • Liker 3
Lenke til kommentar
Oknok skrev (41 minutter siden):

Jeg har hørt om C# og nå har jeg sagt alt jeg vet om C#.

Håpet Notepad++ hadde en metode som kunne brukes. Jeg har ca en halvtimes erfaring med Notepad++ og har ikke oversikt over hva det kan gjøre.

 

Det er ikke så mye å vite om dette. Bare at det er mange tusen linjer og jeg ønsker å fjerne alle som har enkelte ord til felles.

Kunne også gjort det den motsatte veien og kun søkt etter linjer som har data jeg er interessert i, men jeg er ikke sikker på hva alle søkeordene er. Det virker da lettere å angripe det med å fjerne ting som er i veien.

 

Så du ønsker å fjerne hver linje som har ett eller flere ord i seg?

Lenke til kommentar

Litt dårlig forklart hvordan du indentifiserer hvilke linjer du ønsker å fjerne, men sånn jeg forstår da identifiserer de med ett eller flere ord. 

Dette er veldig enkelt i Notepad++.

Du åpner først filen du skal jobbe med. 
Trykker ctrl+F for å få opp søkefunksjon (eventuelt Search på menyen, og så Find). 

I søkefunksjonen velger du Mark (fanen til høyre), og sørger for at "Bookmark Line" er på. 

Så skriver du inn søkeordet ditt, og velger Mark All. 
Har du flere søkeord, kan du gjøre dette flere ganger, de markerte linjene blir behold. 

Da skal alle linjene du har markert fått en blå ring ved siden av linjenummeret. 

Deretter velger du Search på meny-linjen, og nesten helt nede er det et alternativ som heter "Bookmark".
Der skal du velge "Remove Bookmarked Lines". 

 

 

  • Liker 2
  • Innsiktsfullt 2
Lenke til kommentar
Zash skrev (51 minutter siden):

Litt dårlig forklart hvordan du indentifiserer hvilke linjer du ønsker å fjerne, men sånn jeg forstår da identifiserer de med ett eller flere ord. 

Dette er veldig enkelt i Notepad++.

Du åpner først filen du skal jobbe med. 
Trykker ctrl+F for å få opp søkefunksjon (eventuelt Search på menyen, og så Find). 

I søkefunksjonen velger du Mark (fanen til høyre), og sørger for at "Bookmark Line" er på. 

Så skriver du inn søkeordet ditt, og velger Mark All. 
Har du flere søkeord, kan du gjøre dette flere ganger, de markerte linjene blir behold. 

Da skal alle linjene du har markert fått en blå ring ved siden av linjenummeret. 

Deretter velger du Search på meny-linjen, og nesten helt nede er det et alternativ som heter "Bookmark".
Der skal du velge "Remove Bookmarked Lines". 

 

 

Ganske så tungvint i forhold til å bruke regex

  • Liker 1
Lenke til kommentar
57 minutes ago, Zash said:

Litt dårlig forklart hvordan du indentifiserer hvilke linjer du ønsker å fjerne, men sånn jeg forstår da identifiserer de med ett eller flere ord. 

Dette er veldig enkelt i Notepad++.

Du åpner først filen du skal jobbe med. 
Trykker ctrl+F for å få opp søkefunksjon (eventuelt Search på menyen, og så Find). 

I søkefunksjonen velger du Mark (fanen til høyre), og sørger for at "Bookmark Line" er på. 

Så skriver du inn søkeordet ditt, og velger Mark All. 
Har du flere søkeord, kan du gjøre dette flere ganger, de markerte linjene blir behold. 

Da skal alle linjene du har markert fått en blå ring ved siden av linjenummeret. 

Deretter velger du Search på meny-linjen, og nesten helt nede er det et alternativ som heter "Bookmark".
Der skal du velge "Remove Bookmarked Lines". 

 

 

Sagt på ein annen måte vil jeg slette alle linjer som inneholder et bestemt ord. Det du foreslår virker som en enkel måte, men jeg har skjult linjenummer i Notepad++ og nå finner jeg ikke hvor man slår dem på. 😛 Leter i "View" drop down menu og kan ikke finne det. Leter andre steder også.

 

Skal også set på RegEx når jeg klarer å konse. Just nå er det uklart hvordan den brukes. Jeg installerte en plugin som heter "Regex Trainer".

 

Endret av Oknok
Lenke til kommentar
Oknok skrev (31 minutter siden):

Det du foreslår virker som en enkel måte, men jeg har skjult linjenummer i Notepad++ og nå finner jeg ikke hvor man slår dem på. 😛 Leter i "View" drop down menu og kan ikke finne det. Leter andre steder også.

Notepad++ v8.7 (64-bit) -- Menyline: Settings > Preferences... > Margins/Borders/Edge

line-numbers.png.e87a4c76667623508d96f52d8ec807b7.png

Endret av backtoback
versjon
  • Liker 1
Lenke til kommentar

Dette tar 2 min med hvilket som helst programmeringsspråk. Samme om du velger C#, Java, Python, selv Javascript fikser denne jobben. ChatGPT vil gi deg et fullverdig program på sekunder. Du kan også bruke regex (med eller uten nevnte programmeringsspråk). For mer komplisert logikk foretrekker jeg å kode det fremfor regex, da regex er mye vanskeligere å lese/forstå.

Endret av Abigor
  • Liker 1
Lenke til kommentar
SuperKrokodille skrev (16 minutter siden):

Til gjengjeld tar jo metoden ti sekunder å lære da. Ikke mye vits i å bruke tid på å lære seg RegEx om man ikke har bruk for slikt siden.

Kanskje, men nå har jo man allerede fått løsningen her i tråden, som ikke tar lange tiden å bruke heller. Dessuten så er premisset ditt om at dette skal kun brukes en gang ikke noe vi vet noe om, og andre som finner denne tråden kan ha nytte av det.

  • Liker 1
Lenke til kommentar
Oknok skrev (3 timer siden):

Jeg har hørt om C# og nå har jeg sagt alt jeg vet om C#.

Håpet Notepad++ hadde en metode som kunne brukes. Jeg har ca en halvtimes erfaring med Notepad++ og har ikke oversikt over hva det kan gjøre.

 

Det er ikke så mye å vite om dette. Bare at det er mange tusen linjer og jeg ønsker å fjerne alle som har enkelte ord til felles.

Kunne også gjort det den motsatte veien og kun søkt etter linjer som har data jeg er interessert i, men jeg er ikke sikker på hva alle søkeordene er. Det virker da lettere å angripe det med å fjerne ting som er i veien.

 

Hvis du har tilgang på en mac, eller Linux maskin gjør du dette lett med egrep. 

Sitat

egrep -v 'A|B|C' my_text

 

Endret av sk0yern
Lenke til kommentar

Microsoft Copilot var så snill å lage et regex-mønster med forklaring til meg :grin:. Det fungerte som det skulle når jeg testet det.

"Just testing":
fr-etter.thumb.png.822c5d0f2bfbc124595b4b7fe037b74b.png

You
Kan du lage et regex-mønster for notepad++ for å fjerne alle linjer som inneholder ordet `POSITION`?


Copilot
Selvfølgelig! For å fjerne alle linjer som inneholder ordet POSITION i Notepad++, kan du bruke følgende regex-mønster:

1. Åpne Notepad++.
2. Trykk Ctrl + H for å åpne “Replace...”-vinduet.
3. Velg “Replace” fanen.
4. I “Find what” feltet, skriv inn følgende regex-mønster:

^.*\bPOSITION\b.*\R

Dette mønsteret betyr:

^: Dette angir starten på en linje.
.*: Dette matcher ethvert tegn (unntatt linjeskift) null eller flere ganger.
\b: Dette er en ordgrense. Det sikrer at “POSITION” matches som et helt ord, ikke som en del av et annet ord (f.eks. “positions” eller “deposition”).
POSITION: Dette er den bokstavelige strengen “POSITION”.
\b: En annen ordgrense for å sikre at “POSITION” matches som et helt ord.
.*: Igjen, dette matcher ethvert tegn (unntatt linjeskift) null eller flere ganger.
\R: Dette matcher enhver Unicode linjeskiftsekvens (f.eks. \n, \r\n, osv.).
Oppsummert matcher dette regex-mønsteret enhver linje som inneholder hele ordet “POSITION” hvor som helst i linjen. \R på slutten sikrer at matchen inkluderer linjeskiftet på slutten av linjen.

5. La “Replace with” feltet være tomt.
6. Sørg for at “Search Mode” er satt til “Regular expression”.
7. Klikk på “Replace All”.

Dette vil fjerne alle linjer som inneholder ordet POSITION. 

Endret av backtoback
"just testing"
  • Innsiktsfullt 1
Lenke til kommentar
  • 3 uker senere...
Oknok skrev (På 29.9.2024 den 6:33 PM):

Takk for forslaget. Men det er en funksjon for å erstatte det som blir funnet med noe annet.

 

 

det kan brukes til det også. men du kan gjøre akkurat hva du vil med det som matcher. i ditt tilfelle ville det vært å la "noe annet" være "ingenting".

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...