【问题标题】:how to split large csv into multiple small csv using linux?如何使用 linux 将大 csv 拆分为多个小 csv?
【发布时间】:2014-08-11 10:22:05
【问题描述】:

需要使用php和linux将大型csv文件分行拆分成多个文件。

CSV 包含 -

"id","name","address"
"1","abc","this is test address1 which having multiple  newline
separators."
"2","abc","this is test address2
which having multiple newline  separators"
"3","abc","this is test address3.
which having multiple
newline separators."

我使用了 linux 命令 - split -l 5000 testfile。

但它无法以正确的格式拆分 csv,因为在 csv 中有一个字段地址具有多个换行符,因此命令从该行拆分文件。

我也尝试过使用 PHP:

$inputFile = 'filename.csv';
$outputFile = "outputfile";
$splitSize = 5000;
$in = fopen($inputFile, 'r'):
$header = fgetcsv($in);
$rowCount = 0;
$fileCount = 1;

while (!feof($in)) { 
    if (($rowCount % $splitSize) == 0) {
        if ($rowCount > 0) {
            fclose($out);
        }   
        $filename = $outputFile . $fileCount++;
        $out = fopen($filename .'.csv', 'w');
        chmod($filename,777);
        fputcsv($out, $header);
    }   
    $data = fgetcsv($in);
    if ($data) {
        fputcsv($out, $data);
        $rowCount++;
    }   
}
fclose($out);

如何解决这个问题?

【问题讨论】:

  • 使用能够解析 CSV 的编程语言
  • 我用php试过了,但是会花太多时间。有没有其他解决方案来解决这个问题?
  • PHP 应该很快。可以展示一下你用过的PHP代码吗?
  • 请不要将代码作为评论发布,你看,它很难阅读。改为编辑您的问题。 (我为你做了,因为这是你的第一篇文章)
  • PHP 代码看起来不错,应该可以正常工作

标签: linux csv split


【解决方案1】:

使用 Ruby:

ruby -e 'require "csv"
        f = ARGV.shift
        CSV.foreach(f).with_index{ |e, i|
            File.write("#{f}.#{i}", CSV.generate_line(e, force_quotes: true))
        }' file.csv

PHP:

<?php
    $inputFile = 'file.csv';
    $outputFile = 'file.out';
    $splitSize = 1;
    if (($in = fopen($inputFile, 'r'))) {
        $header = fgetcsv($in);
        $rowCount = 0;
        $fileCount = 0;
        while (($data = fgetcsv($in))) {
            if (($rowCount % $splitSize) == 0) {
                if ($rowCount > 0) {
                    fclose($out);
                }
                $filename = $outputFile . ++$fileCount . '.csv';
                $out = fopen($filename, 'w');
                chmod($filename, 755);
                fputcsv($out, $header);
            }
            fputcsv($out, $data);
            $rowCount++;
        }
        fclose($out);
    }
?>

【讨论】:

    【解决方案2】:

    Linux 有一个很棒的小工具,叫做 split,它可以把一个文件分割成你想要的任何大小的块,例如 100 行块。

    但是,对于 CSV 文件等,每个块通常需要在其中包含标题行。不幸的是, split 命令没有这个选项。但是,您可以使用更多代码来实现它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多