Ich habe eine laaange Textdatei, Playlist von einer Webseite.
dort sind 2 verschiedene immer wiederkehrende Zeilen und der Text
dazwischen kann gelöscht werden. Das würde die Datei erheblich kürzen.
hier mal ein Ausschnitt:
1
STILTSKIN - INSIDE
2
06:11
3
STILTSKIN
4
INSIDE
5
iTunes
6
Reamonn - Aeroplane
7
06:06
8
Reamonn
9
Aeroplane
10
iTunes
11
Mötley Crüe - Wild Side
12
06:02
13
Mötley Crüe
14
Wild Side
15
iTunes
16
The Killers - Read My Mind
17
05:53
18
The Killers
19
Read My Mind
20
iTunes
21
Eagles - Hotel California
22
05:47
23
Eagles
24
Hotel California
25
iTunes
26
Jimmy Eat World - The Middle
27
05:44
28
Jimmy Eat World
29
The Middle
30
iTunes
da Band und Titel immer 2 mal vorhanden sind und ich auch die Zeitangabe
sowie das Wort "itunes" da drin nicht brauche,
Suche ich einen Kniff, um alles Zwischen Zeitangabe und "itunes" zu
löschen. incl. der genannten Zeilen. Sodass da am Ende nur die Zeilen
"Bandname - Titel"
übrig bleiben.
Man muss also z.B. per Kommandozeile oder Prog also nach Doppelpunkt und
dem Wort "itunes" suchen und alles da drin liegende löschen.
Nur was kann man da nutzen?
Betriebssysteme Win oder Ubuntu.
Sofern ' - ' NICHT auch in einem Songtitel oder Bandname auftaucht...
Da Win nicht das standard Werkzeug grep hat, muss die Anleitung des
Befehls "find" gelesen werden.
Kommandozeile vor dem Frühstück für Alle! schrieb:> Da Win nicht das standard Werkzeug grep hat, muss die Anleitung des> Befehls "find" gelesen werden.
Windows bietet für derartige Verrenkungen das leistungsfähigere
findstr.
Alternativ kann man sich natürlich auch einen Win32-Port von grep
installieren, dazu kann man sich entweder den Linux-Emulator "cygwin"
auf den Rechner packen, oder --sofern das Windows neu genug ist-- die
aktuelle Variante der "Unix Services for Windows" installieren, oder
minimalistisch nur das hier:
http://gnuwin32.sourceforge.net/packages/grep.htm
Für solch einfache Sachen lade ich die Datei ins Notepad++.
Da gibt es einen sehr einfach zu bedienenden Makrorekorder.
Einmal von Hand löschen dann einfach wiederholen...
Amateur schrieb:> Einmal von Hand löschen dann einfach wiederholen...
obwohl zwischen den genannten Zeilen immer verschiedener Text steht?
Auch kann mit der Zeit die Anzahl der Zeilen dazwischen variieren.
Wie wärs mit Python?
Die Stuktur ist ja immer gleich, also einfach durch die Zeilen durch
iterieren, mitzählen und je nachdem Zeile löschen oder nicht löschen.
Siehste, sowas macht unsereiner mit Delphi:
Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht,
welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters.
Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.
Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich
hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer
Quelltext.
W.S.
Wenn es keine Anhaltspunkte dafür gibt, was gelöscht werden soll, geht
das Ganze nur mit der neuen Software von Hellseher.
Deine Liste habe ich folgendermaßen bereinigt:
Start Makroaufzeichnung
Ctrl F
:
"Such-Fenster schließen"
Home
Schift-Taste halten
4 X Cursor Down
Schift-Taste loslassen
Entfernen
Ende Makroaufzeichnung
Nach Bedarf wiederholen.
Natürlich ist das Ganze für ‘n Ars**, wenn Du jetzt sagst, dass Du aus
einer völlig anderen Liste Deine Kenndaten extrahieren willst.
Aber wie bereits gesagt: Deine ganz speziellen Wünsche kann nur eine
hellseherische Software voraussehen.
Übrigens: Alle Zeiten könnten durch die Suche nach dem Doppelpunkt
gefunden werden. Falls nicht irgendeine Combo auf die Idee gekommen ist
ihn in ihrem Bandnamen zu verwenden.
Fixe Namen können durch die Suche danach erreicht werden.
Die zweite Wiederholung kann, da nicht schematisierbar z.B. durch die
Suche nach der Zeit und dem Löschen der folgenden zwei Zeilen getilgt
werden. Hier gilt aber: Es gibt Kuddel-Muddel, wenn diese dann nicht
folgen. Hier gilt dann aber was ich zum Thema: Ganz andere Liste gesagt
habe.
W.S. schrieb:> Siehste, sowas macht unsereiner mit Delphi:>> Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht,> welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters.> Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.>> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer> Quelltext.>> W.S.
z.B.
Aber so etwas ist genau das, wofuer PERL erfunden wurde.
Wie so oft, viele Wege sind moeglich.
asdfghjkll
:)
Erklaerung:
qa - Makro mit dem Namen "a" aufzeichnen
j - Eine Zeile nach unten gehen
4dd - Entferne 4 Zeilen
q - Makro beenden
:normal @a - Makro "a" bis zum Ende der Datei wiederholen
W.S. schrieb:> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer> Quelltext.
Auch mit grep & co. ist das kein Problem, wenn man mit regulären
Ausdrücken ("regex") umgehen kann. Die sind für derartige Aufgaben
erfunden worden. Sehen zwar aus, als hätte eine Katze auf die Tastatur
gekotzt, sind aber wirklich sehr, sehr mächtig.
Bei grep besteht das schon von "Kommandozeile vor dem Frühstück für
Alle!" angemerkte Problem, das sich die "guten" von den "schlechten"
Zeilen nicht immer durch ihren Inhalt unterscheiden lassen.
Wenn ich das Problem aber richtig verstanden habe, sind die guten Zeilen
anhand ihrer Position in der Datei festgelegt (Zeile 1, 6, 11, 16 ...).
Für solche Dinge eignen sich sed und awk sehr gut.
Die sed-Lösung wurde schon von c.m. geliefert. Hier dasselbe mit awk:
1
awk 'NR%5==1' datei.txt
W.S. schrieb:> Aber in Pascal geschrieben ist das nur ein recht kurzer Quelltext.
Ja, oder in Fortran ;-)
also meine Vorstellung ist die, dass ich alles,
was zwischen dem Zeichen ":" und dem Wort "iTunes" liegt löschen möchte.
Es müsste also eben dieses "markiert" werden
und alles, was dazwischen liegt, soll gelöscht werden.
Incl der Zeilen, in denen diese "Markierungen" sitzen
jetzt stelle man sich mal eine hunderte Seiten lange Liste vor,
in der Namen so lang sind, dass es Zeilenumbrüche gibt,
dass man immer mal wieder mehrere Leerzeilen dazwischen hat,
in der nicht immer 4 Zeilen dazwischen liegen (auch mal 3 oder 5)
uswusf.
eben eine Liste die innerhalb einiger Monate zusammen kopiert worden
ist.
sowas wie "jede n-te Zeile löschen" läuft dann schnell verkehrt.
es müsste im Grunde "nur" eine Editier-Funktion
wie im Programm "Ant-Renamer" für Dateinamen auch für Texte geben.
sowas in der Art suche ich.
Ich denke das könnte mir schon gut helfen.
J-A VdH hat doch schon geschrieben, wie er/sie/es sich das vorstellt:
> Suche ich einen Kniff, um alles Zwischen Zeitangabe und "itunes" zu> löschen. incl. der genannten Zeilen. Sodass da am Ende nur die Zeilen>> "Bandname - Titel">> übrig bleiben.>> Man muss also z.B. per Kommandozeile oder Prog also nach Doppelpunkt und> dem Wort "itunes" suchen und alles da drin liegende löschen.
Mit sed oder grep ist das aber leider nicht ganz einfach, weil die per
Default immer nur zeilenweise arbeiten. Damit ist es dann nur mit
Verrenkungen möglich, alles ab der Zeile, in der ein Doppelpunkt
vorkommt bis einschließlich der Zeile, in der das nächste mal "iTunes"
vorkommt, zu löschen.
Aber mal eine ganz andere Frage:
● J-A V. schrieb:> Ich habe eine laaange Textdatei, Playlist von einer Webseite.>> dort sind 2 verschiedene immer wiederkehrende Zeilen und der Text> dazwischen kann gelöscht werden. Das würde die Datei erheblich kürzen.
Wieviele Gigabytes ist diese Playliste denn "laaang"? Oder anders: Warum
ist die Größe denn überhaupt ein Problem?
● J-A V. schrieb:> also meine Vorstellung ist die, dass ich alles,> was zwischen dem Zeichen ":" und dem Wort "iTunes" liegt löschen möchte.
Ist denn garantiert, dass ":" und "iTunes" nicht auch in einem der
Bandnamen oder einem der Titel auftauchen? Sonst wird's schwierig.
Man kann natürlich nach Zeilen suchen, die ausschließlich eine
Zeitangabe der Form mm:ss bzw. das Wort "iTunes" enthalten. Aber wenn es
tatsächlich eine Band namens iTunes oder einen Song namens 08:15 gibt,
was dann?
Könnte es auch passieren, dass bei einem Eintrag die Zeitdauer oder das
"iTunes" fehlt? Dies könnte dazu führen, dass zu viele Zeilen aus der
Datei gelöscht werden.
> jetzt stelle man sich mal eine hunderte Seiten lange Liste vor,> in der Namen so lang sind, dass es Zeilenumbrüche gibt,> dass man immer mal wieder mehrere Leerzeilen dazwischen hat,> in der nicht immer 4 Zeilen dazwischen liegen (auch mal 3 oder 5)> uswusf.
Ich dachte ursprünglich, die Datei hätte ein festes, klar definiertes
Format, so dass sie auch von einem Abspielprogramm gelesen werden kann.
Aber das geht ja alleine schon wegen der Zeilenumbrüche nicht ohne
weiteres.
Ach ich bin blöd, ich hab immer verkehrt gedacht.
Ich hab immer die zu löschenden Zeilen im Kommando anzugeben versucht.
man kann doch auch das was stehen bleiben soll angeben.
Dann sieht das Kommando nur noch so aus:
grep "-" old.txt > new.txt
ich bin halt "konsolenblind" ;)
● J-A V. schrieb:> Dann sieht das Kommando nur noch so aus:>> grep "-" old.txt > new.txt
Das klappt aber nicht, wenn der Bandname (vor dem "-") oder der Titel
(nach dem "-") einen Zeilenumbruch enthält.
Yalu X. schrieb:> Das klappt aber nicht, wenn der Bandname (vor dem "-") oder der Titel> (nach dem "-") einen Zeilenumbruch enthält.
das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.
Vollständig kann eine solche Liste eh nie sein.
>das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.>Vollständig kann eine solche Liste eh nie sein.
... und wenn Du nur einmal übersiehst, dann fehlen einige Titel.
Diese Playlisten wurden von verschiedenen Leuten geschrieben, demzufolge
sind sie auch nicht homogen.
Geh' mal davon aus, dass irgendwo ein Doppelpunkt in irgendeinem
Bandnamen vorkommt und auch ein Titel mit einer Zeitangabe ist dabei;-)
Amateur schrieb:>>das kommt so wenig vor, dass ich das händisch erstmal aussortieren kann.>>Vollständig kann eine solche Liste eh nie sein.> ... und wenn Du nur einmal übersiehst, dann fehlen einige Titel.
dann müsste man halt vollständig syntaktisch parsen.
1
STILTSKIN - INSIDE
2
06:11
3
STILTSKIN
4
INSIDE
5
iTunes
erste zeile enthält $string1+" - "+$string2
zweite zeile enthält dezimal+":"+dezimal
dritte zeile $string1
vierte $string2
fünfte "iTunes"
wenn das alles zutrifft, ist $string1+" - "+$string2 der komplette
gesuchte string.
händisch müsste man dann nur noch zeilen1 auswerten die mehrere " - "
enthalten. aber das kann man ja abfangen und loggen.
> Dann sieht das Kommando nur noch so aus:>> grep "-" old.txt > new.txt>> ich bin halt "konsolenblind" ;)
Achtung: " - " - nicht "-"!
(Zumindest gemäss den vorgelegten Musterdaten...)
> Eine simple Kommandozeilen-App schreiben, die im Text nach Zeilen sucht,> welche eine Uhrzeit-Angabe enthalten, als nummer:nummer und nix weiters.> Dann die jeweils DAVOR liegende Zeile in die Ausgabedatei schreiben.>> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich> hinkriegt. Aber in Pascal geschrieben ist das nur ein recht kurzer> Quelltext.
<ungeprüft Quelle="ausmÄrmel">
> Auch mit grep & co. ist das kein Problem, wenn man mit regulären> Ausdrücken ("regex") umgehen kann. Die sind für derartige Aufgaben> erfunden worden. Sehen zwar aus, als hätte eine Katze auf die Tastatur> gekotzt, sind aber wirklich sehr, sehr mächtig.
REs (regular expressions) sind für Anfänger, echte Männer nutzen PCREs
;-)
<ungeprüft Quelle="ausmÄrmel">
W.S. schrieb:> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich> hinkriegt.
Tja, da bewahrheitet sich mal wieder der alte Spruch:
Wer nichts Weiß muss alles Glauben ;-)
Rufus Τ. F. schrieb:> Sehen zwar aus, als hätte eine Katze auf die Tastatur> gekotzt, sind aber wirklich sehr, sehr mächtig.
Unsere laufen nur drueber, das Ergebnis sieht aber aehnlich aus;-)
Und ja, die Moeglichkeiten sind gewaltig.
afggjgcjzc
Norbert schrieb:> W.S. schrieb:>> Ich vermute mal, daß man sowas mit grep und Konsorten nicht wirklich>> hinkriegt.>> Tja, da bewahrheitet sich mal wieder der alte Spruch:>> Wer nichts Weiß muss alles Glauben ;-)
eine kleine grep-Zeile hat mein Problem längst erschlagen ;)