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
  Salvesen. skrev (På 29.9.2024 den 16.17):

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

Ekspander  

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
  likferd skrev (På 29.9.2024 den 16.26):

La meg introdusere deg til Regex

Ekspander  

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
  Oknok skrev (På 29.9.2024 den 16.33):

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

Ekspander  

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 (På 29.9.2024 den 16.25):

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.

 

Ekspander  

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 (På 29.9.2024 den 18.10):

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". 

 

 

Ekspander  

Ganske så tungvint i forhold til å bruke regex

  • Liker 1
Lenke til kommentar
  Zash skrev (På 29.9.2024 den 18.10):

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". 

 

 

Ekspander  

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 (På 29.9.2024 den 19.06):

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å.

Ekspander  

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 (På 29.9.2024 den 19.15):

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.

Ekspander  

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 (På 29.9.2024 den 16.25):

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.

 

Ekspander  

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

Ekspander  

 

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...

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...