【问题标题】:Combining 2 CSV files合并 2 个 CSV 文件
【发布时间】:2011-03-24 10:28:44
【问题描述】:

我正在尝试在 PHP 中合并两个 CSV 文件。我正在寻找完美的方法。到目前为止,这是我的代码:

$one = fopen('data5.csv', 'r');
$two = fopen('userdata.csv', 'r');

$final = fopen('final_data.csv', 'a');

$temp1 = fread($one, filesize("data5.csv"));
$temp2 = fread($two, filesize("userdata.csv"));

fwrite($final, $temp1); 
fwrite($final, $temp2);

【问题讨论】:

  • 或者,如果您不再需要原始数据,您可以逐行读取第二个 csv 并将其附加到第一个。完成后,删除第二个 csv 并重命名第一个 ..

标签: php


【解决方案1】:

如果您有大型 CVS 并且您不想使用机器的大量 RAM(例如,假设每个 CSV 为 1GB),我将为您提供一个解决方案。

<?php
function joinFiles(array $files, $result) {
    if(!is_array($files)) {
        throw new Exception('`$files` must be an array');
    }

    $wH = fopen($result, "w+");

    foreach($files as $file) {
        $fh = fopen($file, "r");
        while(!feof($fh)) {
            fwrite($wH, fgets($fh));
        }
        fclose($fh);
        unset($fh);
        fwrite($wH, "\n"); //usually last line doesn't have a newline
    }
    fclose($wH);
    unset($wH);
}

用法:

<?php
joinFiles(array('join1.csv', 'join2.csv'), 'join3.csv');

趣事:

我只是用它来连接 2 个 CSV 文件,每个文件约 500,000 行。耗时约 5 秒,使用了 512kb 的内存。

逻辑:

打开每个文件,读取一行,然后将其写入输出文件。是的,写入每一行而不是写入整个缓冲区可能会更慢,但这允许使用繁重的文件,同时对机器的内存很温和。 在任何时候,您都是安全的,因为脚本一次只能在线读取然后写入。

享受吧!

【讨论】:

  • 我们如何在 joinFiles 数组上运行循环时加入多个文件。像这样:' for ($f = 1; $f
【解决方案2】:

怎么样...

file_put_contents('final_data.csv',
    file_get_contents('data5.csv') .
    file_get_contents('userdata.csv')
);

请注意,这会将整个文件加载到 PHP 内存中。因此,如果它们很大,您可能会遇到 memory_limit 问题。

【讨论】:

    【解决方案3】:

    如果你只想连接这两个文件,你可以通过执行一个 shell 脚本来轻松地做到这一点,假设你在像 os 这样的 unix 上:

    exec("cat data5.csv > final_data.csv && cat userdata.csv >> final_data.csv");
    

    【讨论】:

      【解决方案4】:
      ob_start();  
      $dir1 = "csv/2014-01/";  
      $dir = $_REQUEST['folder_name'];  
      $totalfiles =  count(glob($dir."/*",GLOB_BRACE));  
      echo "Total files in folder = ".$totalfiles;  
      if ($opend = opendir($dir)){  
          $i =0;  $final_array_export= array();  
          $fil_csv =end(explode('/',$dir));  
              $file_name = 'download/'.$fil_csv.'.csv';
              $file_cre = fopen($file_name,"w");
              $headers = array("header1","header2");
              fputcsv($file_cre,$headers);
              while (($file = readdir($opend)) !== false){
                  $filename = $dir.'/'.$file;
                  $files = fopen($filename,"r");
                  if($files){
                      $fullarray = fgetcsv($files);
                      $head=array();
                      if(count($fullarray) >0){    
                          foreach($fullarray as $headers){    
                              $head[] = $headers;  
                          }
                      }
      
                      while($data =  fgetcsv($files,0,",")){
                          if(count($data) >0 && count($head) >0){
                              $array_combine = array_combine($head,$data);
                          }
      
                          fputcsv($file_cre,$array_combine);  
                      }
                  }
              }
      
              fclose($file_cre);
              header("Content-Type: application/force-download");
              header("Content-type: application/csv");
              header('Content-Description: File Download');
              header('Content-Disposition: attachment; filename=' . $file_name);
              header('Content-Transfer-Encoding: binary');
              header('Expires: 0');
              header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
              header('Pragma: public');
              header('Content-length: ' . filesize($file_name));
              ob_clean();
              flush();
              readfile($file_name);
          }
      

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 其长期价值,通过展示为什么这是解决问题的好方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      猜你喜欢
      • 1970-01-01
      • 2016-05-01
      • 2015-09-18
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      相关资源
      最近更新 更多