如何根据指定的行数拆分CSV文件?

时间:2013-12-21 16:31:57

标签: linux unix csv split

我在LINUX服务器上存储了CSV文件(大约10,000行;每行有300列)。 我想将这个CSV文件分成500个CSV文件,每个文件有20条记录。 (每个具有与原始CSV中相同的CSV标题)

是否有任何linux命令可以帮助进行此转换?

6 个答案:

答案 0 :(得分:113)

使用Linux split命令:

split -l 20 file.txt new    

拆分文件" file.txt"以名称" new"开头的文件每个包含20行文本。

在Unix提示符下键入man split以获取更多信息。但是,您必须先从file.txt中删除标头(例如,使用tail命令),然后将其重新添加到每个拆分文件中。

答案 1 :(得分:65)

把它变成一个功能。您现在可以致电splitCsv <Filename> [chunkSize]

splitCsv() {
    HEADER=$(head -1 $1)
    if [ -n "$2" ]; then
        CHUNK=$2
    else 
        CHUNK=1000
    fi
    tail -n +2 $1 | split -l $CHUNK - $1_split_
    for i in $1_split_*; do
        echo -e "$HEADER\n$(cat $i)" > $i
    done
}

发现于:http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html

答案 2 :(得分:13)

这应该为你做 - 你的所有文件最终都会被称为Part1-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

答案 3 :(得分:11)

这应该有用!!!

file_name =要拆分的文件的名称。
10000 =每个拆分文件包含的行数
file_part_ =拆分文件名的前缀(file_part_0,file_part_1,file_part_2..etc继续)

  

split -d -l 10000 file_name.csv file_part _

答案 4 :(得分:9)

我有一个一线回答(此示例为您提供999行数据,每个文件包含一个标题行)

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

https://stackoverflow.com/a/53062251/401226

答案 5 :(得分:0)

这个问题是多年前提出的,但对于未来的读者,我想提一下,用于此目的的最方便的工具是 https://github.com/BurntSushi/xsv 中的 xsv

split 子命令旨在完全按照原始问题中的要求执行操作。文档说:

split - Split one CSV file into many CSV files of N chunks

每个分割块都保留标题行。