从PHP中的大型CSV文件中读取多个列

时间:2013-12-22 10:30:53

标签: php csv

我需要从大型CSV文件中读取两列。 CSV有多列,有时可能具有以下属性:

  1. ~25,000行
  2. 包含空格和空白行
  3. 不均匀(某些列长于其他列)
  4. enter image description here

    在上面的示例CSV文件中,我只对“购买”和“销售”列(A列和D列)中的代码感兴趣。

    我编写了以下代码(警告:它不是很优雅)迭代所有行并只读取我需要的列。我创建字符串作为1个大型MYSQL查询的输入(而不是运行许多小查询)。

    <?php 
    //Increase the allowed execution time 
    set_time_limit(0);
    ini_set('memory_limit','256M');
    ini_set('max_execution_time', 0);     
    
    //Set to detect the ending of CSV files
    ini_set('auto_detect_line_endings', true);
    
    $file = "test.csv";
    
    $buy = $sold = ""; //Initialize empty strings
    
    if (($handle = @fopen($file, "r")) !== FALSE) {
    
    while (($pieces = fgetcsv($handle, 100, ",")) !== FALSE) {       
    
    if ( ! empty($pieces[0]) ) {
        $buy .= $pieces[0] ." ";
    } 
    
    if ( ! empty($pieces[3]) ) {
       $sold .= $pieces[3] ." ";
    } 
    }
    
    echo "Buy ". $buy ."<br>"; //Do something with strings...
    echo "Sold ". $sold ."<br>";
    
    //Close the file
    fclose($handle);  
    }
    

    &GT;

    我的问题是:这是执行此类任务的最佳方式吗?该代码适用于较小的测试文件,但是我在这样迭代CSV文件时忽略了一些缺点吗?

1 个答案:

答案 0 :(得分:1)

首先,如果将它们存储在变量中,读取任何大文件都会占用大量内存。您可以查看reading large files(more than 4GB in unix)

其次,您可以输出$ buy&amp; $出售 在while循环中,这两个变量未保存在内存中的方式可能更有效。

最后,在php fseek documentation

中使用文件搜索方法