根据大小将单个大csv文件拆分为多个csv文件,并通过UNIX保存源文件的文件头

时间:2016-03-16 12:04:46

标签: csv unix

我们得到了:单个文件csv文件,字段名称为标题。

我们需要什么:

  1. 根据文件的大小,我们需要将其拆分为带有exptension _00 *的多个较小的csv文件。
  2. 条件:如果file_size&lt; 5 GB然后没有动作。            如果File_size&gt; 5 GB然后将其拆分为多个文件,其中任何维度的范围介于(1 GB到<5 GB)之间。 在这里我们需要注意的是,在按大小拆分文件时,我们不会拆分单个记录。

    1. 我们需要保留源文件的标头记录并将其复制到每个新文件中。

    2. 除了每个小文件外,还需要创建一个具有相同名称但带有扩展名(.ok)的空白文件。它仅用于通知文件已创建。

    3. 最后删除源文件。只保留新文件。并创建1个与源文件同名的最终文件,但扩展名为.ok

    4. 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代码。

1 个答案:

答案 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
}