如何读取它在循环中停止的位置?

时间:2011-01-31 16:55:37

标签: php mysql loops

我的文本文件有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数据库来删除已经从文本文件读取的数据,以防止循环从文本文件的第一行再次读取它。就多个文件而言,这是一项巨大的努力。

4 个答案:

答案 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()的偏移量 并继续阅读。