将csv文件减少到两列的最快方法

时间:2012-02-09 23:41:56

标签: php

我有一个csv文件,里面有30,000行。它也有9列。为了加快处理所有我希望将文件缩减到我需要的两列并删除其余部分。这就是我所做的。

$retardment=1;//17;// 151;  //499;//  991;// 1877
if (($handle = fopen($source, "r")) !== FALSE) {
    $stock_handle = fopen($source_stock, "w+"); 
    $row=0;
    $col=array();
    while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
            unset($line[1]);
            unset($line[2]);
            unset($line[3]);
            unset($line[4]);
            unset($line[5]);
            unset($line[6]);
            unset($line[8]);
            unset($line[9]);
        if($row%$retardment<1){
            fputcsv($stock_handle, $line);
        }
            unset($line);
        $row++;
    }
    fclose($handle);
    fclose($stock_handle);
}

我正在将它复制到一个新文件中,这可行...但它看起来很慢。关于如何让它更快的任何想法?感谢您的帮助。

干杯 - 杰里米

{EDIT} 到目前为止,这似乎需要同样长的时间。但工作得很好

while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
    if($row%$retardment<1){
        fputcsv($stock_handle, array($line[0],$line[7]));
    }
    $row++;
}

2 个答案:

答案 0 :(得分:0)

您可以将这些unset()来电替换为......

$line = array($line[0], $line[7]);

或者,请记住unset()需要多个参数......

unset($line[1], $line[2], ...);

答案 1 :(得分:0)

你可以稍微加快速度,但同样是微缩时间() - 可衡量的改进:感知是它不会明显加快。

while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) { 
    if($row++ % $retardment < 1){ 
        fputcsv($stock_handle, array($line[0],$line[7])); 
    } 
}

但是由于你的脚本是IO绑定的,实际的读写操作是最慢的函数,你无法加速它们。

stream_copy_to_stream()stream input filter一起使用可能是另一种方法,但除非您可以减少磁盘访问时间,否则您不会看到明显的改进