2016-08-08 90 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 

一个例子,我想拿到三个单独的文件,分别包含

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

我希望代码为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

它正在与你提出的改变,现在我只需要了解第二个条件的意义:) – wittywater

+0

假设第一行开始01.正则表达式匹配失败,但文件未打开,所以或条件为真。代码跳过关闭并打开新文件并写入该行。此后,文件被打开,所以条件的后半部分不会改变决策制定(除非将其放慢,可能无法衡量)。 –

+0

这说明了我的困惑,我很感激帮助。 – wittywater