我们得到了:单个文件csv文件,字段名称为标题。
我们需要什么:
条件:如果file_size&lt; 5 GB然后没有动作。 如果File_size&gt; 5 GB然后将其拆分为多个文件,其中任何维度的范围介于(1 GB到<5 GB)之间。 在这里我们需要注意的是,在按大小拆分文件时,我们不会拆分单个记录。
我们需要保留源文件的标头记录并将其复制到每个新文件中。
除了每个小文件外,还需要创建一个具有相同名称但带有扩展名(.ok)的空白文件。它仅用于通知文件已创建。
最后删除源文件。只保留新文件。并创建1个与源文件同名的最终文件,但扩展名为.ok
Ex:源文件:file_name_20160316.csv大小:8.8 Gb
输出:
file_name_20160316_001.csv(大小:4 GB) file_name_20160316_001.ok file_name_20160316_002.csv(大小:4.8 GB) file_name_20160316_002.ok file_name_20160316.ok
请帮助我们编写相同的Unix代码。
答案 0 :(得分:0)
#!/usr/bin/perl -p
BEGIN
{
$dim = 5e9;
$header = <>; # We need to preserve the header record
exit if -s ARGV < $dim; # If file_size < 5 GB then no action.
$headsize = $told = tell;
# ranges between ( 1 GB to < 5 GB )
$dim = ($dim+(-s _)/int(1+(-s _)/$dim))/2 if (-s _)%$dim <= 1e9;
($base = $ARGV) =~ s/.csv/_/;
$extent = "000"
}
if (tell > $lim) # need new file?
{
$lim = $told+$dim-$headsize;
open OK, ">$base$extent.ok" and close OK if $output;
$output = $base.++$extent.'.csv';
open STDOUT, ">$output" or die "$output: $!\n";
print $header # replicate into each new file.
}
$told = tell;
END
{
open OK, ">$base$extent.ok" and close OK if $output;
chop $base;
unlink $ARGV and open OK, ">$base.ok" and close OK
}