2013-12-21 265 views
45

我已經存儲在LINUX服務器上的CSV文件(大約10,000行;每行有300列)。 我想把這個CSV文件分成500個CSV文件,每個文件20個記錄。 (每個版本與原始CSV文件中的CSV標頭相同)如何根據指定的行數分割CSV文件?

是否有任何Linux命令可以幫助進行此轉換?

+0

這確實有效,但是,第一個文件的標題將被複制,從而給出第一個csv文件2個標題。 – rickman

回答

45

這工作:

tail -n +2 file.txt | split -l 20 - split_ 
for file in split_* 
do 
    head -n 1 file.txt > tmp_file 
    cat $file >> tmp_file 
    mv -f tmp_file $file 
done 

上找到:http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html

+1

你能解釋它的工作方式嗎?我查了原帖,但也沒有解釋,甚至沒有發表評論的選項。 – shashi009

+4

如果CSV中的單元格包含換行符,該怎麼辦? –

+0

是什麼樣的換行符?它仍然適用於我,UTF-8,不知道這是否有幫助。 – owyongsk

85

使用Linux的分裂命令:

split -l 20 file.txt new  

分割文件「file.txt的」與名稱開頭的「新」,每箱20行,每行的文本文件。

在Unix提示符下鍵入man split以獲取更多信息。但是,您必須先從file.txt中刪除標題(例如,使用tail命令),然後將其重新添加到每個分割文件。

+0

帶有示例鏈接的好的詳細信息:: https://kb.iu.edu/d/afar – user2663609

+0

如何跳過file.txt(頭)行? – forkfork

+0

使用'wc -l'獲取行數,然後取這個值減1(假設'wc -l'給出了50),然後運行'tail -n 49'(在這個例子中)來獲得除了標題行。請注意,'wc -l'計數爲個字符,所以如果最後一行不以換行符結尾,則行數將減1。 –

10

這應該爲你做到這一點 - 所有的文件將結束所謂的第一部分,Part500。

#!/bin/bash 
FILENAME=10000.csv 
HDR=$(head -1 $FILENAME) # Pick up CSV header line to apply to each file 
split -l 20 $FILENAME xyz # Split the file into chunks of 20 lines each 
n=1 
for f in xyz*    # Go through all newly created chunks 
do 
    echo $HDR > Part${n} # Write out header to new file called "Part(n)" 
    cat $f >> Part${n}  # Add in the 20 lines from the "split" command 
    rm $f     # Remove temporary file 
    ((n++))     # Increment name of output part 
done 
+0

這創建了文件,但製表符(我的意思是\ t)被替換爲空格,並且我的CSV文件使用\ t作爲分隔符 – AmineG

+0

這可以通過填充數字來稍微改進,以便文件連續顯示自動。用$(printf「%05d \ n」$ n)替換$ {n} –

+1

標題行在第一個文件中被複制。 –

2

這應該工作!

file_name =要分割的文件的名稱。
10000 =行數各分割文件將包含
file_part_ =分割的文件名(file_part_0,file_part_1,file_part_2..etc變亮)的前綴

分裂-d -l 10000 file_name.csv file_part_

相關問題