【问题标题】:How to split CSV files as per number of rows specified?如何根据指定的行数拆分 CSV 文件?
【发布时间】:2014-01-10 08:22:00
【问题描述】:

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

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

【问题讨论】:

标签: linux unix csv split


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    https://stackoverflow.com/a/53062251/401226 其中的答案是关于安装正确版本的并行程序的 cmets(在 ubuntu 中使用特定的并行程序包,它比 moreutils 中捆绑的更新)

    【讨论】:

      【解决方案3】:

      把它变成一个函数。您现在可以拨打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
              sed -i -e "1i$HEADER" "$i"
          done
      }
      

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

      【讨论】:

      • 你能解释一下它的工作方式吗?我检查了原始帖子,但也没有任何解释,甚至没有发布 cmets 的选项。
      • 如果 CSV 中的单元格包含换行符怎么办?
      • 这是什么换行符?它仍然适用于我,在 UTF-8 上,不确定这是否有帮助。
      • @shashi009:假设原始文件名为file.txt。 1:跳过第一行,然后将文件的其余部分通过管道传输到 split,它会拆分为每 20 行长的新文件,前缀为 split_ 2:遍历新的 split_* 文件,将每个名称存储到变量file,一次一个 3:对于每个... 4:将原始文件的第一行(列标题)写入tmp_file 5:将20行拆分文件附加到tmp_file 6:覆盖旧的 split_* 文件和新的tmp_file,所以它保留了列标题
      • 通过echo -e "$HEADER\n$(cat $i)" > $i 在标题前添加不必要的无效。我将其替换为sed -i -e "1i$HEADER" "$i"
      【解决方案4】:

      这应该工作!!!

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

      split -d -l 10000 file_name.csv file_part_

      【讨论】:

      • 这绝对没问题!有没有办法可以限制我创建的 10000 行文件的数量。假设我只想将前 200,000 行分成 10k 行 csv 文件,而忽略其余的。
      • @Pronomita head -200000 file.csv | split -l 10000 - new_
      • 我有一个 13 Gb 的 CSV 文件,其中一行损坏的行大约在 ~69 000 000 行。它阻止了导入 bigquery。这让我可以递归地拆分它,直到我可以隔离这条线并修复它。没有其他解决方案能够在不关闭服务器或锁定内容的情况下有效地处理大文件。花了大约 2 分钟将文件拆分为 5 000 000 行块。谢谢!
      • 请注意,这与the most upvoted answer 有相同的问题,它也使用split:如果您的 CSV 包含嵌入换行符的单元格,它将失败并弄乱结果。 split 只会将它们分成两半,无论如何都会将它们分成两块。
      【解决方案5】:

      使用 Linux 拆分命令:

      split -l 20 file.txt new    
      

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

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

      【讨论】:

      • 如何跳过 file.txt 的第一个(标题)行?
      • 使用wc -l获取行数,然后将此值减去1(假设wc -l给出50)然后运行tail -n 49(在此示例中)以获取除标题行。请注意,wc -l 会计算 个字符,因此如果最后一行没有以换行符结尾,则行数将减少 1。
      • @lucas, tail -n +2 将打印除第一行之外的所有行。
      • 请注意:如果您的列值中包含换行符(例如从 Excel 或其中包含大块文本的数据库表导出),这将无法正常工作。
      • 要在新文件中保留“.csv”,只需添加--additional-suffix=.csv
      【解决方案6】:

      这应该会为您完成 - 您的所有文件最终都会被称为 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
      

      【讨论】:

      • 这创建了文件,但制表符(我的意思是 \t)被替换为空格,我的 CSV 文件使用 \t 作为分隔符
      • 这可以通过填充数字来稍微改进,以便自动连续显示文件。通过将 ${n} 替换为 $(printf "%05d\n" $n)
      • 标题行在第一个文件中重复。
      • @JuhaPalomäki - 在编辑中修复了该问题。
      • 请注意,这与the most upvoted answer 有相同的问题,它也使用split:如果您的 CSV 包含嵌入换行符的单元格,它将失败并弄乱结果。 split 只会将它们分成两半,无论如何都会将它们分成两块。
      猜你喜欢
      • 2015-01-09
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多