3.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich habe zwei Text-Files:
- eines mit Zeilennummern, also z.B. 4 7 10 (jeweils eine Zeile pro Nummer)
- ein zweites mit einer beliebigen Anzahl an Einträgen

Nun möchte ich die Zeilen, die in File 1 stehen aus File 2 in ein neues kopieren oder löschen.
Hat da jemand eine Idee (für Windows)?

Habe es schon mit ssed versucht und
ssed -n 4,7,10p file2.txt > neu.txt

bringt grundsätzlich den gewünschten Erfolg, nur werden die Zeilennummern da nicht aus einer Datei gelesen, sondern müssen eingegeben werden. Da es aber um ca. 1500 Zeilen geht, möchte ich die nur ungern eingeben.

Bin für jeden Tip dankbar.

Grüsse neki

9 Antworten

0 Punkte
Beantwortet von
Korrektur: ssed liefert doch nicht das richtige - es würde nur
ssed -n 4,7p file2.txt > neu.txt

funktionieren und dann würden die Zeilen 4-7 in ein neues Dokument geschrieben
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Moin

1) Könntest Du mal einen Auschnitt aus File 1 und 2 zeigen und wie das Ergebnis aussehen soll? Ist mir im Moment unklar. 2) Soll das unbedingt mit Batch funktionieren?
0 Punkte
Beantwortet von
Muss nicht unbedingt mit Batch funktionieren. :-)

Datei 1:
Nachname|Vorname|Strasse|Ort|
Huber|Hans|Strasse 1|Berlin|
Muster|Max|Weg 7|München|
Lehner|Lara|Gasse 3|Hamburg|

Datei 2:
1
3

Resultat entweder:
Huber|Hans|Strasse 1|Berlin|
Lehner|Lara|Gasse 3|Hamburg|

oder:
Nachname|Vorname|Strasse|Ort|
Muster|Max|Weg 7|München|


Hintergrund ist der: ich habe eine Datei mit 400.000 Zeilen und eine weitere Datei, in der steht, welche Zeilen bereits verarbeitet wurden (aber nur als Zeilennummer) - irgendwie sollte ich jetzt aus der einen Datei die noch nicht verarbeiteten herausbekommen.
Ob die in eine neue Datei kopiert oder aus der alten gelöscht werden, ist egal.

Ist's jetzt etwas klarer?
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Ist's jetzt etwas klarer?

Deutlich ;-)

Kommen die Zeilennummern in File 2 aufsteigend vor, oder können die auch unsortiert sein? Und von welchen Datenmengen (MB) reden wir bei den beiden Files jeweils?
0 Punkte
Beantwortet von
:-)

Die sind definitiv aufsteigend.

File 1 ca. 300MB
File 2 ca. 40 KB (wenn es die Zeilen enthält die gelöscht werden sollen) bzw. ca. 3,5 MB (mit den Zeilen, die bleiben sollen)
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Okay, dann lass ich die Routine grad so wie sie ist. Ich hab sie nämlich mal auf Verdacht extrem grosse Dateien ausgelegt. Auf Zeitmessung und Fortschrittsanzeige habe ich jetzt mal verzichtet. Kann man immer noch einbauen, wenn die Routine öfter benötigt wird. Aber ich gehe jetzt mal davon aus, das ist eine einmalige Geschichte.

Installier Dir bitte zuerst AutoIt 3. Das ist eine sehr mächtige und trotzdem leicht zu lernende Skriptsprache. Die Installation ist simpel, sauber und AI3 verbiegt auch nicht das halbe Windows.

---

; 2011 Luke Filewalker, supportnet.de

Opt('MustDeclareVars', 1)
Opt("TrayAutoPause", 0)

; config start
Local Const $Database = "base.txt"
Local Const $FilterFile = "filter.txt"
Local Const $OutputFile = "output.txt"
; config end

Local $file1, $file2, $file3, $line, $eof2 = False, $lastrecord, $lcounter, $tcounter

$file1 = FileOpen($Database, 0)
$file2 = FileOpen($FilterFile, 0)
$file3 = FileOpen($OutputFile, 2)

$lastrecord = FileReadLine($file2)
While 1 = 1
$line = FileReadLine($file1)
If @error = -1 Then ExitLoop
$lcounter += 1
If $lcounter < $lastrecord Or $eof2 Then
FileWriteLine($file3, $line)
$tcounter += 1
Else
If Not $eof2 Then
$line = FileReadLine($file2)
If @error = -1 Then
$eof2 = True
Else
$lastrecord = $line
EndIf
EndIf
EndIf
WEnd

FileClose($file1)
FileClose($file2)
FileClose($file3)

MsgBox(0, "supportnet.de", $tcounter & " Records wurden extrahiert.")
---


Leg eine neue Textdatei an mit dem Suffix .au3, der Name ist egal. Bei mir heisst sie schlicht extract.au3. Dann den Code in die Datei einfügen, speichern und mit Doppelklick starten. Das Skript geht davon aus, dass sich alle Dateien im gleichen Verzeichnis wie das Skript befinden. Im Config Teil musst halt Deine Dateien angeben.
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Achja noch was: das ist Quick&Dirty, d.h. keinerlei Fehlerbehandlung. Es dürfen also weder in Deinem File 1 noch in File 2 mittendrin Leerzeilen vorkommen. Sollte das der Fall sein, müsste ich nachbessern.
0 Punkte
Beantwortet von neki Einsteiger_in (19 Punkte)
Nachbessern ist nicht nötig - die Dateien waren ohne Leerzeichen oder sonstigen Besonderheiten und es hat super funktioniert.

Vielen, vielen Dank.
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Bitteschön. ;-)
...