2013-05-14 93 views
-4

我需要建议如何创建一个perl程序,该程序可以使用数字线将文件拆分为更小的文件。Perl - 如何将文件拆分为更小的文件

例如:

perl split.pl --file="data.txt" --numberLine=2 

输入

data.txt中:

line1 
line2 
line3 
line4 

输出

DATA1.TXT

line1 
line2 

data2.txt

line3 
line4 

perl split.pl --file="data.txt" --numberLine=1 

DATA1.TXT

line1 

data2.txt

line2 

data3.txt

line3 

data4.txt

line4 

或 perl的split.pl --file = “data.txt中” --numberLine = 3

DATA1.TXT

line1 
line2 
line3 

data2.txt

line4 

回答

1
#!/usr/bin/perl 
# 

use strict; 
use warnings; 
use Getopt::Long; 
use File::Basename; 
my ($length, $file); 

my $res= GetOptions ("numberLine=i" => \$length, 
         "file=s" => \$file); 

my ($name,$path,$suffix) = fileparse($file,("\.txt","\.dat")); 

open(my $fh,$file) || die "$file $!"; 

my $lc=0; 
my $outfh=undef; 
while(<$fh>) { 
    if (($lc % $length) == 0) { 
      my $n=int($lc/$length)+1; 
      open($outfh,">$name$n.txt") || warn "$name$n.txt $!"; 
      } 
    $lc++; 
    print $outfh $_; 
    } 

另外,这里是如何做它作为一个班轮。你刚才设置的“numberLines”自己的脚本行并提供文件名(S)为ARGS

perl -n -e 'print; unless (($.-1)%2){$n++;open(F,">data$n.txt")} print F $_' data.txt 
+0

有几件事情,我注意到,请以此为建设性批评:(1)'vars'编译指示是不必要的,因为全局变量可以用'our'声明。但为什么你甚至需要全局变量? (2)'fileparse'的后缀被视为正则表达式,而不是字符串,所以'''应该真正被转义。 (3)可以使用'$ .'变量代替手动计数行。 (4)除非你想重置'$ .'计数器,否则在重新打开文件句柄之前关闭一个文件句柄并不是必须的。 (5)您不能从只写文件句柄''。 – amon 2013-05-14 08:50:20

+0

1)把''vars''改成''my'' 2)逃脱的点3)在长版本的柜台上留下,因为它可能更清晰4)删除关闭5)一个班轮是batshit错误,现在纠正。谢谢@amon! – Vorsprung 2013-05-14 09:15:31

5

分裂:

system("split -l 2 $file"); 
0
sed -e '1,2wdata1.txt' -e '3,$wdata2.txt' data.txt