2012-11-25 22 views
1

我有一個文件,我目前解析現在csv文件(如.TXT製造),但文件大小約爲350MB壓縮。當它被壓縮時,它在zip文件中顯示爲23mb。當我嘗試解析350mb文件時,系統完全凍結。我將這些行存儲在這樣的數組中。第一行是標題。如何處理大的CSV文件插入到MySQL

$fh = fopen($inputFile, 'r'); 
    $contents = fread($fh, filesize($inputFile)); // 5KB 
fclose($fh); 
//$contents = str_replace('"','',$contents); 

$fileLines = explode("\n", $contents); // explode to make sure we are only using the first line. 

然後我經過的每一行插入它在一個循環到MySQL。由於該文件大約爲350MB,是否有辦法從.zip文件解析它,比如.zip_filename.txt,還是甚至會有所作爲?

文件過大直接通過導入方法插入到MySQL。

+0

它是'MB'(或'MiB'),但既不是'mB'也不是'mb'。 –

+0

'$內容= FREAD($ FH,文件大小($ INPUTFILE));' - 這是最肯定你不想做什麼:) –

回答

2

使用內置的功能fgetcsv:如果可能的話

<?php 
$row = 1; 
if (($handle = fopen($inputFile, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 
     echo "<p> $num fields in line $row: <br /></p>\n"; 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
      echo $data[$c] . "<br />\n"; 
     } 
    } 
    fclose($handle); 
} 
?> 

還可以使用多插件。而不是運行多個查詢:

insert into table (col1, col2) values("row1-col1", "row1-col2"); 
insert into table (col1, col2) values("row2-col1", "row2-col2"); 

建立一個這樣的查詢要快得多:

insert into table (col1, col2) 
values ("row1-col1", "row1-col2"), 
     ("row2-col1", "row2-col2"); 

順便說一句,你還可以load a file directly into mysql

load data local infile 'file.csv' into table table_name fields terminated by ',' 
enclosed by '"' 
lines terminated by '\n' 
(col1, col2) 
+0

我之前使用的fgetcsv功能,但它是差那麼FREAD。它不會加載整個文件,我嘗試調整內存等,沒有運氣。有數百萬行數據需要存儲。 – user1701252

+0

您可能需要將它們分成批次然後 – sroes

+0

@ user1701252如果它不讀取所有內容,也許某些行超過1000個字符?你可以讓'fgetcsv()'通過''length'傳遞'0'來決定解析多少。 –

0

考慮使用LOAD DATA INFILE,即將允許您直接插入CSV文件的內容。