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

Paw*_*ude 74 unix linux csv split

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

是否有任何linux命令来帮助这种转换?

Jam*_*ing 128

使用Linux split命令:

split -l 20 file.txt new    
Run Code Online (Sandbox Code Playgroud)

将文件"file.txt"拆分为以"new"开头的文件,每个文件包含20行文本.

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

  • 为了将“ .csv”保留在新文件中,只需添加“ --additional-suffix = .csv” (4认同)
  • @lucas,`tail -n + 2`将打印所有行,但第一行. (3认同)
  • 如果您想要 500 个大小大致相似的文件“不分割行/记录”,您也可以执行“split --number=l/500”,或者如果您希望所有文件小于100kB,同样没有跨文件分割的行(参见https://www.gnu.org/software/coreutils/manual/html_node/split-inspiration.html) (2认同)

Mar*_*nov 69

这有效:

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果CSV中的单元格包含换行符怎么办? (5认同)
  • @shashi009:假设原始文件名为file.txt.1:跳过第一行,然后将文件的其余部分传输到`split`,它分成每20行长的新文件,前缀为`split_` 2:遍历新的split_*文件,将每个名称存储到变量`file`,一次一个3:for each ... 4:将第一行(列标题)从原始文件写入`tmp_file` 5:将20行拆分文件追加到`tmp_file` 6:覆盖旧的split_*文件带有新的`tmp_file`,因此它保留了列标题 (3认同)
  • 你能解释一下它的工作原理吗?我检查了原始帖子,但也没有解释,甚至没有发表评论的选项。 (2认同)
  • 通过 `echo -e "$HEADER\n$(cat $i)" > $i` 在前面添加标头是不必要的低性能。我用 `sed -i -e "1i$HEADER" "$i"` 替换它。 (2认同)

Tim*_*son 17

One-liner 保留每个拆分文件中的标题行。此示例为每个文件提供 999 行数据和一个标题行。

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Run Code Online (Sandbox Code Playgroud)

/sf/answers/3714357601/其中答案有关于安装正确版本的并行的评论(在 ubuntu 中使用特定的并行包,它比 moreutils 中捆绑的包更新)


Mar*_*ell 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
Run Code Online (Sandbox Code Playgroud)

  • 标题行在第一个文件中重复. (3认同)

Cor*_*ral 13

这应该工作!!!

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

split -d -l 10000 file_name.csv file_part_

  • 我有一个 13 Gb CSV 文件,在大约第 69 000 000 行处有一个损坏的行。它阻止了向 bigquery 的导入。这使我能够递归地分割它,直到我可以隔离该行并修复它。没有其他解决方案能够如此高效地处理大文件,而不会导致服务器停机或锁定内容。将文件拆分为 5 000 000 行块大约需要 2 分钟。谢谢! (2认同)