2014-11-03 34 views
0

我想將一打100MB + csv文件分割成一個捲曲文章的可管理較小文件。分裂一個CSV文件,並保持頭文件沒有中間文件

我已經設法做到了,但有很多臨時文件和IO。它正在永恆。

我希望有人能讓我更有效地做到這一點;最好用幾乎沒有磁盤IO #!/ bin/sh的

for csv in $(ls *.csv); do 
    tail -n +2 $csv | split -a 5 -l - $RANDOM.split. 
done 

# chose a file randomly to fetch the header from 

header=$(ls *.csv |sort -R |tail -1 | cut -d',' -f1) 

mkdir split 

for x in $(/usr/bin/find . -maxdepth 1 -type f -name '*.split.*'); do 
    echo Processing $x 
    cat header $x >> split/$x 
    rm -f $x 
done 

上述腳本可能無法完全正常工作。我基本上通過這些命令的組合來工作。

我決定在上傳失敗的情況下完全讓curl POST成爲另一個步驟;如果全部發布,我不想丟失數據。但是,如果說curl錯誤,數據可能會被放入重做文件夾中,那麼這可以起作用。

#!/bin/sh 

# working on a progress indicator as a percentage. Never finished. 
count=$(ls -1 | wc -l 2> /dev/null | cut -d' ' -f1) 

for file in $(/usr/bin/find . -maxdepth 1 -type f); do 
    echo Processing $file 
    curl -XPOST --data-binary @$file -H "Content-Type: text/cms+csv" $1 
done 

編輯1 - 爲什麼隨機的?因爲當拆分下一個文件時,拆分將生成完全相同的文件,如同第一個文件所做的那樣。所以... aa ab ac ...將針對每個文件生成。我需要確保通過拆分生成的每個文件在整個運行過程中都是唯一的

+0

您總是要讓I/O從現有文件中編寫新版本的文件。儘可能高效地完成這個過程應該是你的關注焦點。因爲你的問題中有太多「其他」的東西。 (爲什麼$ RANDOM,這是您的解決方案的真正需求,還是您正在嘗試,其他方面也不清楚)。可能包括輸入文件結構的ascii藝術,然後是來自這些輸入的預期輸出文件。 (只是一個小樣本集)。祝你好運。 – shellter 2014-11-03 05:14:29

+0

分割時總是會產生相同的文件。我需要隨機確保每個文件分割都會產生獨特的分割文件 – 2014-11-03 05:19:34

+0

對於我來說已經很遲了,我無法從您的口頭描述中描繪出您想要做的事情,但我相信其他人很快就會用可行的解決方案來打好基礎。祝你好運! – shellter 2014-11-03 05:21:27

回答

0

不太清楚您想完成什麼,但在我看來,您正在逐行處理。因此,如果您序列化所有csv文件和行,則無需磁盤I/O即可完成。但是從您的描述中,我無法判斷此腳本是運行多個實例還是隻運行一個實例(多個進程或一個進程)。因此,我可以盡我所能模仿您的腳本以儘可能達到類似的結果,但要解決磁盤I/O問題。提供的代碼下面,但如果有的話請糾正腳本錯誤,因爲我沒有辦法運行/調試/驗證:

for csv in $(ls *.csv | sort -R); do 
    # first read line skip the first line, since I see your tail -n +2 command. 
    (read line; 
    count=0; 
    while read line; do 
     Processing $line; 
     count=$(($count + 1)); 
     echo $csv.$count >> split/$count; 
    done 
    ) < $csv 
done 

你的「處理」的代碼現在應該從一個詳細的線過程,而不是一個文件。也許管,有你的Processing來處理STDIN將這樣的伎倆:

echo $line | Processing 

你捲曲可以做類似的方式,從標準輸入處理,與-更換@$file,並且可以打印你想要捲曲什麼發送然後用管道將其捲曲,類似如下:

ProcessingAndPrint | curl -XPOST --data-binary - -H "Content-Type: text/cms+csv" $1 
+0

我不是看到$ csv被拆分的地方。 – 2014-11-04 22:35:13

+0

在你的分割中,你使用-1來爲每個分割文件分割一行,即逐行分割。等價地,我使用while循環+讀取+ I/O重定向,即「<」來逐行讀取。這是一個即時閱讀+處理。 – 2014-11-05 01:43:58

相關問題