2011-01-31 32 views
1

我確實有500k數據的文本文件。如何從循環中停止的地方讀取數據?

我正在運行一個循環來存儲一些信息。像..

$file = fopen("top-1-500000.txt", "r") or exit("Unable to open file!"); 
while(!feof($file)) { //some function 
mysql_query("INSERT INTO table (name) VALUES ('$value')"); 
    } fclose($file); 

的問題是當循環中間停止,然後我需要通過讀取MySQL數據庫中刪除其已經從文本文件中讀取數據的手動,以防止環路從文本第一行讀一遍文件。這對於多個文件來說是一個巨大的努力。

+0

你如何讀取文件?每行的行數或每個字符的字符數? – 2011-01-31 16:59:35

+0

每行讀取一行 – leon 2011-01-31 17:01:56

+0

爲什麼循環在中間停止?是否有人手動終止腳本(如使用Ctrl-C)? – 2011-01-31 17:17:59

回答

2

讀取大文件的另一種方法是使用MySQL LOAD DATA INFILE功能。

例子:

LOAD DATA INFILE 'top-1-500000.txt' INTO TABLE tbl_name 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES; 
0

如果使用file()讀取文件,你可以只使用一個櫃檯裏面一個for循環計數的迭代次數,那麼當你需要回到循環停止的地方,使用計數器

$file_array = file("top-1-500000.txt"); 
for($i=0;$i<count($file_array);$i++) 
{ 
    // ...code here... 
    mysql_query("INSERT INTO table (name) VALUES ('$value')"); 
} 

而且,這是假設這不是一個絕對龐大的文件

0

您正在閱讀的行的文件行,所以

$line = fgets($handle); 

會讀1024 chars by default(你可以指定)

有一個叫做fseek的函數,你可以通過它來導航內部文件指針並從那個地方讀取。 一個可能的解決方案是在數據庫中保留讀取行的數量,並且當(如果)環路死在中間時,可以使$number_lines * 1024成爲fseek() 的偏移量並繼續繼續閱讀。

1

我假設「停在中間」意味着腳本超時。你應該使用set_time_limit來防止你的腳本超時(我假設你的服務器配置允許你這樣做)。