使用Perl进行文件拆分

时间:2016-08-08 14:04:58

标签: regex perl file parsing file-handling

我正在尝试将大型文本文件拆分为多个文本文件。我发现几年前的另一个线程有一个非常相似的前提但是找不到我的确切情况。

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

我想获得三个单独的文件,分别包含

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

丢弃前三行。

1 个答案:

答案 0 :(得分:1)

像这样修改循环中的条件是不是可以完成这项工作?

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

假设第一行未启动00:00:00:00(一个零标记&#39;)。正则表达式匹配失败,但文件未打开,因此|| !$outfh条件为真。 if正文中的代码跳过关闭并打开新文件,并将该行写入新文件。此后,该文件是打开的,因此该条件的后半部分不会改变决策(除了将其减慢并且可能无法估量)。

自从我第一次提出解决方案以来,这个问题得到澄清。如果要在第一个零标记之前丢弃行,则仅在文件句柄打开时修改打印才能打印(如果第一行没有以零标记开头,则修改打开文件的修改条件)。

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