读取大型csv文件,其中包含逗号和php

时间:2019-01-01 16:33:59

标签: php csv

我有需要用php读取的csv文件。我使用了2种方法,但是主题存在问题。

我使用的

方法是: 1- file_get_contents 2-fgetcsv 让我们来解释一下csv文件。关于文件的问题是字段包含用于定界符及其麻烦的逗号。 第一种方法很快,但是字段中的逗号使其不能像数字分隔符14,200那样正常工作。我用一个名为固定编号的函数来固定它。但是仍然有包含逗号的随机文本,并且不遵循我可以修复的任何规则 大型csv的第二种方法非常慢,我无法摆脱它的正常工作 第一种方法的代码如下:

$myFile = file_get_contents($file);
$lines = explode("\r\n",$myFile);//file to an array


while($counter <= count($lines)){
$data=$lines[$counter]; 

$tmp=fixnumbers($data);
$tmp=eregi_replace('"', '',$tmp);
$tmp=explode(',',$tmp); 


if(count($tmp)> 0 ){
$newdata[$datacounter]=$tmp;//explode('*0*',$data);
$datacounter++;
}
$counter++;
}

第二种方法在这里:

$handle= fopen($file,"r");
    $row=1;
       while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
      $num = count($data);

      for ($c=0; $c < $num; $c++) {
          $mydata[$row][$c]=$data[$c] . "<br />\n";
      }$row++;
   }

print "<div class=\"longList\"><pre>";  
        print_r($mydata);
print "</pre></div>";
    fclose($file);


}

1 个答案:

答案 0 :(得分:0)

因此,我等待了几分钟下载文件,抓取了前5条记录,并使用了PHP手册中iframe示例的副本/粘贴。

前5条记录-https://termbin.com/23ti-另存为“ sm_file.csv”

fgetcsv

数据元素36似乎是您遇到的问题,就像您看到<?php if (($handle = fopen("sm_file.csv", "r")) !== FALSE) { $data=array(); $num=0; while (($data[] = fgetcsv($handle, 1000, ",")) !== FALSE) { $num++; } fclose($handle); print_r($data); } ?> [0] => Array ( [0] => از تاريخ وصل 01/07/1397 - با برنامه [1] => تاريخ گزارش: 29/09/1397 [2] => شماره گزارش: (3-5) [3] => صفحه 1 [4] => گزارش قطع و وصل فيدرهاي فشار متوسط (نمونه 3) [5] => ملاحظات [6] => شرايط جوي [7] => عملكرد ريكلوزر [8] => رله عامل [9] => خاموشي (MWh) [10] => بار فيدر (A) [11] => مدت قطع [12] => زمان وصل [13] => تاريخ وصل [14] => زمان قطع [15] => تاريخ قطع [16] => نوع اشكال بوجود آمده [17] => فيدر فشار متوسط [18] => پست فوق توزيع [19] => شماره پرونده [20] => رديف [21] => ناحيه اسالم [22] => [23] => آفتابي [24] => ندارد [25] => ندارد [26] => 0.21 [27] => 3 [28] => 132 [29] => 11:30 [30] => 1397/07/04 [31] => 09:18 [32] => 1397/07/04 [33] => جهت كار در حريم شبكه [34] => گيسوم [35] => اسا لم [36] => 96,042,429,972 [37] => 1 [38] => 61292.56 [39] => جمع کل بار فيدر: [40] => 393.85 [41] => جمع کل خاموشي: [42] => 92,725 [43] => جمع مدت قطع: ) 可以很好地处理它一样,您只需要在处理数据时将字符串转换为数字即可。只需删除逗号。

fgetcsv

哪个给

<?php

if (($handle = fopen("sm_file.csv", "r")) !== FALSE) {
    $data=array();
    $num=0;
    while (($data[] = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $data[(count($data)-1)][36]=str_replace(",","",$data[(count($data)-1)][36]);
    }
    fclose($handle);
    print_r($data);
}

?>

关于耗时多长时间,您的2k条记录的完整文件

[36] => 96042429972

在适度的i5和8GB内存上。没有看到任何问题。