2013-05-04 156 views
5

我有一个很大的CSV文件。我想根据其中一个字段中的值将此文件分成单独的文件。如何在PHP中分割CSV文件?

这就是我所做的。使用fgetcsv我将CSV转换为数组,并使用in_array,我检查内容并显示它是否包含数组中的字符串。

我将从另一个文本文件迭代获取比较字符串以检查它是否包含在csv中。在这种情况下,我已经指定它为“测试”。

下面是代码:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

      if(in_array("Testing", $data)) 
      { 
       var_dump($data); 
      } 
     } 

     fclose($handle); 
    } 

这是工作,但现在我卡住了。如何将$data写入另一个CSV文件?还是有更好的方法来做到这一点?

+0

相关:http://stackoverflow.com/questions/9645699/copy-file-content-to-another-file – Gordon 2013-05-04 08:02:25

回答

6

这其实很简单,如果字符串只是必须有就行了,你甚至不需要fgetcsv。只是

$srcFile = new SplFileObject('test.csv'); 
$destFile = new SplFileObject('new.csv', 'w+'); 
foreach ($srcFile as $line) { 
    if (strpos($line, 'testing') !== FALSE) { 
     $destFile->fwrite($line); 
    } 
} 

这将创建两个文件对象。第一个持有源文件的内容。第二个为包含搜索字符串的行创建全新文件。然后我们遍历每一行并检查搜索字符串是否存在。如果是这样,我们将它写入目标文件。

源文件不会被这样触及。如果你想让一个文件包含搜索字符串和一个没有文件的文件,只需创建第三个SplFileObject并添加一个else块,然后将该行写入该文件。最后,删除源csv文件。

1

你要做我这样做提供了一些基本的想法有些棘手的事情,这里是代码:

//opening file 
if ($fp = fopen('log.csv', 'r')) { 
    $line_number = 0; 

    //loop for Reading file as line by line csv file 
    while ($line = fgetcsv($fp, 0, ';')) { 
    if ($line_number++ == 0) { 
     continue; 
    } 

    //array data string to make possible to provide file name 
    //according to column name required 
    $date = explode(' ', $line[0]); 

    //Change the column name according to your needs 
    $file = $date[0] .'.log'; 

    file_put_contents(
     //change the folder name according to your needs 
     'monthly/'. $file, 
     //printing data in appended file 
     implode(';', $line) ."\n", 
     FILE_APPEND 
    ); 
    } 

    //closing file 
    fclose($fp); 
} 

它逐行读取CSV文件中的行,从第一列提取日期部分,并创建新文件并将数据附加到它。

注:

文件夹“每月”必须是可写

+0

这比它需要更复杂 – Gordon 2013-05-04 07:24:05

+0

它是唯一的方法来拆分我认为的巨大文件 – Vineet1982 2013-05-04 07:26:08