【问题标题】:File splitting using Perl使用 Perl 进行文件拆分
【发布时间】:2016-08-08 14:04:58
【问题描述】:

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

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

丢弃前三行。

【问题讨论】:

  • 您希望文件如何拆分?
  • 我希望代码为每次出现的 00:00:00:00 创建一个文件,在下一个实例之前结束。如果所有 00:00:00:00 的行都向下移动几行,我将如何实现?
  • 你的预期输出是什么?
  • 您应该向我们展示您的样本数据的预期输出,并且您的样本数据应该说明必须处理的任何极端情况(第一行的第一列中没有00:00:00:00,例如)。

标签: regex perl file parsing file-handling


【解决方案1】:

像这样修改循环中的条件不起作用吗?

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

假设第一行不是以00:00:00:00 开头(一个“零标记”)。正则表达式匹配失败,但文件未打开,因此|| !$outfh 条件为真。 if 正文中的代码跳过关闭并打开新文件,并将该行写入新文件。此后,文件打开,因此条件的后半部分不会改变决策(除了稍微放慢速度并且可能无法测量)。

自从我第一次提出我的解决方案以来,这个问题就得到了澄清。如果要丢弃第一个零标记之前的行,请将 print 修改为仅在文件句柄打开时才打印(而不是修改后的条件以在第一行不以零标记开头时打开文件)。

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

【讨论】:

  • 它正在与您提出的更改一起使用,现在我只需要了解第二个条件的重要性:)
  • 假设第一行从 01 开始。正则表达式匹配失败,但文件未打开,因此 or 条件为真。代码跳过关闭并打开新文件并写入该行。此后,文件打开,因此条件的后半部分不会改变决策(除了稍微放慢速度并且可能无法测量)。
  • 这澄清了我的困惑,感谢您的帮助。
  • 自从我提供了我的解决方案后,这个问题就得到了澄清。如果要丢弃第一个零标记之前的行,请将打印修改为仅在文件句柄打开时打印。
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多