Как читать откуда он остановился в цикле? - PullRequest
1 голос
/ 31 января 2011

У меня есть текстовый файл с данными 500 тыс.

Я запускаю цикл для хранения некоторой информации.что-то вроде ..

$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 ]

2 голосов
/ 31 января 2011

Альтернативным методом чтения большого файла является использование функциональности 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 голос
/ 31 января 2011

Я предполагаю, что "остановился посередине", вы имеете в виду, что сценарий истекает. Вы должны использовать set_time_limit, чтобы предотвратить истечение времени ожидания вашего скрипта (я предполагаю, что конфигурация вашего сервера позволяет вам сделать это).

0 голосов
/ 31 января 2011

Вы читаете файл построчно, поэтому

$line = fgets($handle);

будет читать 1024 символа по умолчанию (вы можете указать это)

Есть функция с именем fseek , с помощью которого вы можете перемещаться по внутреннему указателю файла и читать с этого места.Возможное решение состоит в том, чтобы сохранить в базе данных количество прочитанных строк, и когда (если) цикл умирает посередине, вы можете иметь $number_lines * 1024, чтобы быть смещением для fseek(), и продолжать читать дальше.

0 голосов
/ 31 января 2011

если вы используете file() для чтения файла, вы можете просто использовать счетчик внутри цикла для подсчета количества итераций, а затем, когда вам нужно вернуться туда, где цикл остановился, используйте этот счетчик

$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')");
}

Кроме того, предполагается, что это не совсем массивный файл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...