3

我需要将文件拆分为不同的文件。

示例(原始文件):

*****3123123*****RAW
text1
text2
*****2312354***RAW
text3

期望的输出:

[文件1.txt]

*****3123123*****RAW    
text1
text2

[文件2.txt]

*****312312354***RAW
text3

我尝试使用拆分,但我总是在数组中添加一些额外的白色字符

open FILE, "<file";
@file= <FILE>;
close FILE;
@lines = split (/(RAW\n)/, "@file");
foreach $value (@lines) {
  if ($value =~ /[a-z]|[A-Z]|[1-9]/)  {
    print ("$value\n");
  }
}

输出:

*****3123123*****RAW

 text1
 text2

*****312312354***RAW

 text3

编辑:如果我使用 print ("$value") 而不是 print ("$value\n") 这是输出(注意值前的 1 个额外空格:

*****3123123*****RAW
 text1
 text2

 *****12354***RAW
 text3
4

5 回答 5

3

该程序从RAW行中提取十进制数并使用它来命名输出文件。它期望输入文件名作为命令行上的参数。

use strict;
use warnings;

@ARGV or die "Input file required as command-line parameter\n";

my $out;

while (<>) {
  if ( /(\d+)\*+RAW$/ ) {
    open $out, '>', "$1.out" or die $!;
    select $out;
  }
  print $_ if $out;
}
于 2012-06-08T13:17:09.543 回答
2

使用 line-wise IO 可能会做得更好:

my $id = 0;
my $FILE = undef;

while (<>) {
    if (/RAW/) {
        close $FILE if defined $FILE;
        $id++;
        my $path = "File$id.txt";
        open $FILE, '>', $path or die "Could not open $path: $!";
    }
    print $FILE $_ if defined $FILE;
}
close $FILE if defined $FILE;

复制并改编自我的一个脚本,该脚本将邮箱文件拆分为每封邮件一个文件。如果第一行不匹配,您将不得不调整脚本/RAW/

于 2012-06-08T13:08:00.893 回答
2
use strictures;
use File::Slurp qw(read_file write_file);
my $raw = read_file('raw.txt', binmode => ':raw');
my $header = qr/^ (?= [*]+ [0-9]+ [*]+ RAW\n)/msx;
my @chunks = split $header, $raw;
# (
#     "*****3123123*****RAW\ntext1\ntext2\n",
#     "*****2312354***RAW\ntext3"
# )
for my $i (1..@chunks) {
    write_file("File$i.txt", {binmode => ':raw'}, $chunks[$i-1]);
}
于 2012-06-08T13:22:20.450 回答
0

这就是我想出的。我不禁觉得这是在重新发明轮子。

#!usr/bin/perl
my $fi, $fi2;
my $line;
my $i;
my @lines;
my @filenameparts;
my $filename = "file_1.txt";

open($fi, "< original.txt");
@lines = <$fi>;
open ($fi2, " > $filename");

foreach (@lines)
{
if (($i > 0) and $_ =~ /RAW/)
{
    @filenameparts = split("_", $filename);
    foreach (@filenameparts)
    {
        print "Woooo".$_;
    }
    @filenameparts[1] = substr(@filenameparts[1], 0, @filenameparts[1].length() - 5);
    @filenameparts[1] = ($filenameparts[1] + 1);
    $filename = @filenameparts[0]."_".@filenameparts[1].".txt";
    print $filename;
    close($fi2);
    open ($fi2, " > $filename");
    $i = 0;
    print $fi2 $_;

}
else
{
    print $fi2 $_;
}
$i++;

}
于 2012-06-08T13:14:44.073 回答
0

如果您想保留您制作的代码,那么只需将您的行替换print ("$value\n");print ("$value");您就可以了......

或者在print删除\nchomp($value);保留输出之前print ("$value\n");

于 2012-06-08T13:30:24.527 回答