2016-03-16 32 views
0

我們得到了:單個文件csv文件,其中的字段名稱爲頭。根據大小將單個大型csv文件拆分爲多個csv文件並通過UNIX保存源文件的文件頭

我們所需要的:

  1. 在我們需要將它與exptension _00 *拆分爲多個較小的CSV文件的文件大小的基礎。

條件:如果file_size < 5 GB則不採取任何行動。 如果File_size大於5 GB,則將其分割成多個文件,其大小介於(1 GB到< 5 GB)之間。 這裏我們需要注意的是,儘管按大小拆分文件,我們不會拆分單個記錄。

  1. 我們需要保留源文件的頭記錄並將其複製到每個新文件中。

  2. 與每個小文件一起,需要創建一個具有相同名稱但帶有擴展名(.ok)的空白文件。這只是爲了通知該文件已經創建。

  3. 最後刪除源文件。只保留新文件。和創建1個具有相同名稱的最後文件作爲源文件,但帶有擴展.ok

例:源文件:file_name_20160316.csv大小:8.8千兆

輸出:

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

這不是一個問題,而是一個規範,因爲它目前的立場是更適合發佈在許多自由編程網站之一。俗話說,SO不是代碼寫作服務。關於使用awk到Python的工具分割csvs有許多問題:如果您使用的是一個並且遇到問題,那麼您應該編輯您的問題以更具體地瞭解您的困難。 – DSM

回答

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 
} 
相關問題