2013-12-21 222 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_

相关问题