2016-08-08 23 views
0

Ich versuche, große Textdateien in mehrere Textdateien zu teilen. Ich fand einen anderen Thread von vor ein paar Jahren mit einer sehr ähnlichen Prämisse, konnte aber meine genaue Situation nicht finden.Dateiaufspaltung mit Perl

https://unix.stackexchange.com/a/64691/183674

Wie würde ich teilt Sie die folgenden Daten, wenn die erste Zeile nicht mit 00 gestartet wird: 00: 00: 00?

00:00:00:00 00:00:05:00 01SC_001.jpg 
00:00:14:29 00:00:19:29 01SC_002.jpg 
00:01:07:20 00:01:12:20 01SC_003.jpg 
00:00:00:00 00:00:03:25 02MI_001.jpg 
00:00:03:25 00:00:08:25 02MI_002.jpg 
00:00:35:27 00:00:40:27 02MI_003.jpg 
00:00:00:00 00:00:05:00 03Bi_001.jpg 
00:00:05:19 00:00:10:19 03Bi_002.jpg 
00:01:11:17 00:01:16:17 03Bi_003.jpg 
00:00:00:00 00:00:05:00 04CG_001.jpg 
00:00:11:03 00:00:16:03 04CG_002.jpg 
00:01:12:25 00:01:17:25 04CG_003.jpg 

Hier ist der Code als Referenz:

#!/usr/bin/env perl 

use strict; 
use warnings; 

open(my $infh, '<', 'ABC_TabDelim.txt') or die $!; 

my $outfh; 
my $filecount = 0; 
while (my $line = <$infh>) { 
    if ($line =~ /^00:00:00:00/) { 
     close($outfh) if $outfh; 
     open($outfh, '>', sprintf('ABC%02d_TabDelim.txt', ++$filecount)) or die $!;   
    } 
    print {$outfh} $line or die "Failed to write to file: $!"; 
} 

close($outfh); 
close($infh); 

ich nach der while-Anweisung eine print $line; in der nächsten Zeile hinzugefügt versucht, es zu lesen Zeile für Zeile in anderen Tutorials, wie gezeigt, um zu versuchen zu machen, aber das tat behebe das Problem nicht.

Ich würde jede Eingabe schätzen.

edit: So zum Beispiel wie

00:01:16:17 00:00:05:00 01SC_001.jpg 
    00:00:14:29 00:00:19:29 01SC_002.jpg 
    00:01:07:20 00:01:12:20 01SC_003.jpg 
    00:00:00:00 00:00:03:25 02MI_001.jpg 
    00:00:03:25 00:00:08:25 02MI_002.jpg 
    00:00:35:27 00:00:40:27 02MI_003.jpg 
    00:00:00:00 00:00:05:00 03Bi_001.jpg 
    00:00:05:19 00:00:10:19 03Bi_002.jpg 
    00:01:11:17 00:01:16:17 03Bi_003.jpg 
    00:00:00:00 00:00:05:00 04CG_001.jpg 
    00:00:11:03 00:00:16:03 04CG_002.jpg 
    00:01:12:25 00:01:17:25 04CG_003.jpg 

würde Ich mag drei separate Dateien erhalten, die jeweils

00:00:00:00 00:00:03:25 02MI_001.jpg 
00:00:03:25 00:00:08:25 02MI_002.jpg 
00:00:35:27 00:00:40:27 02MI_003.jpg 

00:00:00:00 00:00:05:00 03Bi_001.jpg 
00:00:05:19 00:00:10:19 03Bi_002.jpg 
00:01:11:17 00:01:16:17 03Bi_003.jpg 

00:00:00:00 00:00:05:00 04CG_001.jpg 
00:00:11:03 00:00:16:03 04CG_002.jpg 
00:01:12:25 00:01:17:25 04CG_003.jpg 

verwirft die ersten drei Zeilen enthält.

+1

Wie erwarten Sie, dass die Datei geteilt wird? –

+0

Ich erwarte, dass der Code für jedes Vorkommen von 00: 00: 00: 00 eine Datei erstellt, die kurz vor der nächsten Instanz endet. Wie würde ich das umsetzen, wenn alle Zeilen mit 00: 00: 00: 00 ein paar Zeilen nach unten verschoben wären? – wittywater

+1

Was ist Ihre erwartete Ausgabe? – ssr1012

Antwort

1

Kann die Änderung der Bedingung in der Schleife nicht ausgeführt werden?

if ($line =~ /^00:00:00:00/ || !$outfh) 

Angenommen, die erste Zeile nicht 00:00:00:00 startet (a 'Nullmarke'). Die Regex-Übereinstimmung schlägt fehl, aber die Datei ist nicht geöffnet, daher ist die || !$outfh Bedingung wahr. Der Code in dem if Körper überspringt das Schließen und öffnet die neue Datei und die Zeile wird in der neuen Datei geschrieben. Danach ist die Datei offen, so dass die zweite Hälfte der Bedingung die Entscheidungsfindung nicht ändert (außer sie geringfügig und wahrscheinlich unermesslich zu verlangsamen).

Die Frage wurde geklärt, seit ich zum ersten Mal meine Lösung angeboten habe. Wenn Sie die Zeilen vor der ersten Nullmarke verwerfen möchten, ändern Sie den zu druckenden Ausdruck nur, wenn die Dateikennung offen ist (anstelle der geänderten Bedingung zum Öffnen der Datei, wenn die erste Zeile nicht mit einer Nullmarke beginnt).

print $outfh $line or die "Failed to write to file: $!" if $outfh; 
+0

Es funktioniert mit Ihrer vorgeschlagenen Änderung, jetzt muss ich nur die Bedeutung der zweiten Bedingung verstehen :) – wittywater

+0

Angenommen, die erste Zeile beginnt 01. Die Regex-Übereinstimmung schlägt fehl, aber die Datei ist nicht geöffnet, so dass die oder Bedingung wahr ist. Der Code überspringt das Schließen und öffnet die neue Datei und die Zeile wird geschrieben. Danach ist die Datei geöffnet, so dass die zweite Hälfte der Bedingung die Entscheidungsfindung nicht verändert (außer sie geringfügig und wahrscheinlich unermesslich zu verlangsamen). –

+0

Das verdeutlicht meine Verwirrung, ich schätze die Hilfe. – wittywater