【问题标题】:Is it possible to split a file content after every 6. row with the `split` function?是否可以使用 `split` 功能在每 6. 行之后拆分文件内容?
【发布时间】:2019-10-21 09:20:40
【问题描述】:

是否可以使用split 函数在每 6. 行之后拆分文件内容?

我尝试了不同的模式但没有成功。 最后一个:

split /(?=(?:.+$){6})/, $content;

在本例中每 3. 行:

文件内容:

a1
a2
a3
b1
b2
b3
c1
c2
c3

拆分后的结果:

a1
a2
a3,

b1
b2
b3,

c1
c2
c3

【问题讨论】:

  • 就目前而言,这个问题还很不清楚。如果您能提供一些示例数据、相应的预期结果以及您现有代码的更多内容,我会提供帮助。

标签: perl text split


【解决方案1】:

假设问题是关于如何将多行字符串拆分为 6 行子字符串,然后使用问题中的零宽度前瞻正则表达式

/(?=(?:.+$){6})/m

(请注意,在问题中缺少m 修饰符)无法工作,因为它将在每个行尾匹配($)(前提是后面有六行以上),因此将拆分每行的字符串。我们需要的是一个使用行的正则表达式(不是零宽度断言)。我们可以通过使用

/(?:^[^\n]+\n){6}/m

作为split 中的分隔符正则表达式,并通过将正则表达式放在括号中使 split 返回分隔符。现在,split 会将分隔符与分隔符之间的字符串交错(在这种情况下将是空字符串(因为分隔符彼此跟随,中间没有字符)。使用grep 摆脱空字符串:

my @res = grep {length} split /((?:^[^\n]+\n){6})/m, $content;

【讨论】:

  • 您能否添加一些关于为什么会这样的描述
  • 谢谢,我现在明白了:-)
【解决方案2】:

在您解释的情况下,我不会使用正则表达式。相反,只需查看您已阅读的行数,并在您阅读正确的行数时输出您喜欢的任何内容:

while( <DATA> ) {
    if( $. % 3 ) {  # $. is the line number for that filehandle
        print;
        }
    else {
        chomp;
        print $_, ",\n\n";
        }
    }

__DATA__
a1
a2
a3
b1
b2
b3
c1
c2
c3

如果您的内容在程序中的标量中,您可以在该标量上打开文件句柄,以便使用相同的文件读取工具:

open my $string_fh, '<', \$content;

while( <$string_fh> ) {
    if( $. % 3 ) {  # $. is the line number for that filehandle
        print;
        }
    else {
        chomp;
        print $_, ",\n\n";
        }
    }

把事情变成文件读取问题是我最喜欢的技巧之一,我在Effective Perl Programming 中展示了更多的方法来做这种事情。例如,如果您还想写入字符串而不是标准输出,则可以在标量引用上打开文件句柄:

open my $string_fh, '<', \$content;
open my $out_fh, '>', \(my $out);

while( <$string_fh> ) {
    if( $. % 3 ) {  # $. is the line number for that filehandle
        print {$out_fh} $_
        }
    else {
        chomp;
        print {$out_fh} $_, ",\n\n";
        }
    }

print $out;

这使得在捕获字符串中的信息或写入“真实”文件句柄之间来回切换变得很容易。

【讨论】:

  • 我明白你的意思。 split 方法的原因是我使用App::DBBrowser 在数据库中插入表。从 PDF 文件复制表格后,所有单元格都位于其所在行中。现在使用接受答案中的正则表达式(带有内联修饰符((?m)(?:^[^\n]+\n){6}))分隔记录工作正常。为了删除空行,我使用了“Row_Groups”过滤器。
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多