我需要将文件拆分成不同的文件。
Exmaple(原始文件):
*****3123123*****RAW
text1
text2
*****2312354***RAW
text3
期望的输出:
[FILE1.TXT]
*****3123123*****RAW
text1
text2
[FILE2.TXT]
*****312312354***RAW
text3
我尝试使用split,但我总是在数组中加入一些额外的白色字符
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
答案 0 :(得分:2)
使用行式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/
答案 1 :(得分: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]);
}
答案 2 :(得分:1)
此程序从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;
}
答案 3 :(得分: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++;
}
答案 4 :(得分:0)
如果您希望保留所制作的代码,那么只需将您的行print ("$value\n");
替换为print ("$value");
就可以了......
或print
之前\n
移除chomp($value);
并继续输出print ("$value\n");
。