【发布时间】:2017-03-17 14:56:59
【问题描述】:
我有这个 perl 脚本(如下),它根据每个文件中的行数将 1 个数据文件分成多个。我正在尝试调整此脚本以将第一个文件的第一行(标题行)写入每个拆分文件的顶部。最好的方法是什么?
use strict;
use warnings;
my $source = shift or &usage();
my $lines_per_file = shift or &usage();
my $filename = shift or &usage();
my $target = shift or &usage();
my $filenum = 2;
my $dir = "${target}";
chdir($dir) or die "Failed to cd to $dir: $!";
$filename =~ s{\.[^.]+$}{};
open (my $FH, "<$source") or die "Could not open source file. $!";
open (my $OUT, ">${filename}_1.csv") or die "Could not open destination file. $!";
print "Writing file: ${filename}_1.csv\n";
my $i = 0;
while (<$FH>) {
print $OUT $_;
$i++;
if ($i % $lines_per_file == 0) {
close($OUT);
my $FHNEW = ($filenum);
open ($OUT, ">${filename}_${FHNEW}.csv") or die "Could not open destination file. $!";
print "Writing file: ${filename}_${filenum}.csv\n";
$filenum++;
}
}
sub usage() {
print <<EOF;
PROGRAM NAME: Split .csv file
DESCRIPTION:
Takes a file and creates many small files out of the large file.
EXAMPLE USAGE: splitfile.pl filename.csv 300000 filename /dir/
PARAMETERS:
1. Source File: File name of the source file to partition.
2. Maximum number of lines per file: The number of lines per file.
3. Filename without the extension
4. Target location of split files ending with /
EOF
exit;
}
【问题讨论】:
-
你了解你的代码在做什么吗?你自己写的吗?
-
最好的方法是remember(即store)全局中第一个文件的第一行变量(在
while之外)并在您打开新文件时打印该存储的行。