2016-08-08 14 views
0

大きなテキストファイルを複数のテキストファイルに分割しようとしています。私は数年前から同様の前提で別のスレッドを見つけましたが、私の正確な状況を見つけることができませんでした。Perlを使用したファイル分割

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

どのように最初の行が00で起動しなかった場合、私は、次のデータを分割します: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 

はここで参照のためのコードです:

#!/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); 

私は他のチュートリアルに示すように、それは行ずつ読みにしようとするwhile文の後に次の行でprint $line;を追加しようとしたが、これはやりました問題を修正することはありません。

私は入力を感謝します。

編集:

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 

のような例えばので、私は最初の3行を破棄

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 

を含むそれぞれ、3つの別々のファイルを取得したいと思います。

+1

ファイルをどのように分割すると思いますか? –

+0

私はコードが00:00:00:00のすべての出現に対してファイルを作成し、次のインスタンスの直前で終了することを期待しています。 00:00:00:00の行がすべて数行下にシフトされた場合、どうすれば実装できますか? – wittywater

+1

期待される出力は? – ssr1012

答えて

1

このようなループの条件を変更すると、ジョブは実行されませんか?

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

最初の行は00:00:00:00( 'ゼロマーカー')を開始しないと仮定する。正規表現の一致は失敗しますが、ファイルが開かれていないので、|| !$outfhの条件が真です。 ifのコードでは、閉じるをスキップして新しいファイルを開き、その行が新しいファイルに書き込まれます。その後、ファイルが開いているので、条件の後半では意思決定が変更されません(わずかに遅く、おそらく計り知れないほど遅くなる場合を除く)。

私は最初に私の解決策を提出して以来、質問が明らかになりました。最初のゼロマーカーの前に行を破棄したい場合は、最初の行がゼロマーカーで始まらない場合にファイルを開くための変更された条件ではなく、ファイルハンドルが開いている場合にのみ印刷するように印刷を変更します。

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

あなたの提案された変更に取り組んでいますが、今度は2番目の条件の重要性を理解する必要があります:) – wittywater

+0

最初の行が01を開始するとします。正規表現の一致は失敗しますが、ファイルは開いていません。コードは閉じるをスキップし、新しいファイルを開き、行が書き込まれます。その後、ファイルが開いているため、条件の後半で意思決定が変更されることはありません(わずかに遅く、おそらく計り知れないほど遅くなる場合を除く)。 –

+0

それは私の混乱を明確にして、私は助けに感謝します。 – wittywater

関連する問題