2012-05-20 29 views
1

我有一個CSV文件看起來像這樣解析CSV和進口到PHP慢

col1, col2, col3 
1 , John, ABC 

我需要在第3列解析ABCA,B,C,因爲新的關係需要col1, col3 (each letter)

$j是行,$i是列。

$j = 0; 
while (($row = fgetcsv($handle, 1000, ',')) !== false) { 
    $i = 0; 
    $id = 0; 
    foreach ($row as $field) { 
     # save the id of each row 
     if($j >0 && $i == 0){ 
      $id = $field; 
     } 

     # parse the third column for non-header rows) 
     if($j > 0 && $i >= 3){ 
      $char_array = str_split($field); 
      foreach($char_array as $value){ 
       //echo $value; 
       //echo $id.$value."<br/>"; 
       mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')"); 
      } 
     } 
     $i = $i + 1; # increment the column 
    } 
    $j = $j +1; # move to the next row 
} 
  1. 這是緩慢的。我有超過720行,其中大多數在第三列中有超過5個字符。 ABCDE,所以平均我們有720 x 5。這是一個巨大的數字。 我得到timeout。我可以更改本地執行的最大時間,但我需要在我的學生linux帳戶上運行此操作。我沒有那種特權。

  2. 我懷疑是因爲超時(這次沒有說),我有id = 502。我錯過了其餘的(我有多達720行)。

我該怎麼辦?我只對第一和第三列感興趣。

+0

爲什麼不使用內置的CSV功能,PHP的?fgetcsv(),str_getcsv() – 2012-05-20 19:29:42

+0

你的意思是'LOAD DATA'?或'fgetcsv'?我需要解析它們?我認爲這很難解析。 – user1012451

+0

@Dagon我有'fgetcsv'。那是我如何閱讀csv文件。 – user1012451

回答

2

IO磁盤讀取/寫入也很慢。但它不會超時,並且對於緩存,您不會實際執行那麼糟糕的操作。事實上,我一直這樣做,PHP中的數據大小超過20MB。沒那麼糟糕......如果我真的想做大數據,我會使用Python,C++算法,因爲我已經準備好了。

例如,基於你的代碼(可能有錯誤):

$big = array(); 
$j = 0; 
$k = 0; 

while(....) { 

    .... 
    foreach($char_array as $value){ 
     #mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')"); 
     $big[$k][0] = $id; 
     $big[$k][1] = $value; 
     $k = $k+1; 
    } 

    .... 
} 

這裏你犯了一個嵌套數組。 $big是外部數組,並在裏面指定了列和行。使用fputcsv寫入新的csv。新的CSV,按照您的要求,應該是這樣的:

1,A

1,B

,這裏是寫入到CSV代碼(從PHP DOC)

$fp = fopen('new.csv', 'w'); 

foreach ($big as $fields) { 
    fputcsv($fp, $fields); 
} 
fclose($fp); 

} 

現在你可以加載CSV到數據庫。


編輯。 我剛剛嘗試了720行,使用這樣的數據並複製並粘貼720次。

1, ABCDEFGHIJK 

沒有那麼長...也許1-2秒。

+0

謝謝。你說得對。它快得多... – user1012451

+0

什麼是720行?這是小孩玩!我正在加載1MM +記錄的csv文件。現在這是一個真正的壓力測試儀。 – ProfileTwist

1

[未測試]

$query = ''; 
$array = array(); 

if (($handle = fopen("file.csv", "r")) !== FALSE) { 
    while (($row = fgetcsv($handle, 1000, ',')) !== false) { 
     //$total = count($row); 

     foreach ($row as $key=>$value) { 
      $chrs = str_split($value[2]); 
      foreach ($chrs as $chr){ 
       $array[] = {$value[0], $chr} ; 
      } 
     }   
    } 
} 

foreach ($array as $key=>$value){ 
    $query .= 'INSERT INTO table VALUES ('.$value[0].', "'.$value[1].'")'; 
} 
if ($query <> ''){ 
    mysql_query($query, $connection); 
} 
+0

+1我正要寫這個解決方案:D – tftd

+0

@tftd:對不起。以爲沒有人對此感興趣。 –

+0

像這樣加載查詢或生成csv,然後使用'LOAD'將其轉儲到數據庫中更高效嗎?只是好奇。 – CppLearner