我的文本文件有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 :(得分: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;
答案 1 :(得分:1)
我假设“停在中间”你的意思是脚本超时了。您应该使用set_time_limit
来防止脚本超时(我假设您的服务器配置允许您这样做)。
答案 2 :(得分:0)
如果你使用file()
来读取文件,你可以在for循环中使用一个计数器来计算迭代次数,然后当你需要回到循环停止的地方时,使用那个计数器< / p>
$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')");
}
此外,这是假设这不是一个绝对庞大的文件
答案 3 :(得分:0)
您正在逐行读取文件,所以
$line = fgets($handle);
将会显示1024 chars by default(您可以指定)
有一个名为fseek的函数,您可以使用该函数导航内部文件指针并从该位置读取。
一种可能的解决方案是在数据库中保留读取行的数量,以及何时(如果)循环在中间死亡,您可以$number_lines * 1024
作为fseek()
的偏移量
并继续阅读。