Я собираюсь прочитать текстовый файл размером 200 Мб, а затем отредактировать что-то внутри, а затем сохранить его обратно. Но у меня есть ошибки. Так:
Кроме того, какой метод чтения файлов лучше всего подходит для открытия и анализа больших файлов? Я имею в виду:
Я должен был сделать что-то подобное, прочитав 1 ГБ файл. Я хотел остаться в PHP, поэтому, наконец, я использовал fread для чтения частей файла, поэтапно:
while (!feof($source_file)) { $buffer = fread($source_file, 1024); // use a buffer of 1024 bytes $buffer = str_replace($old,$new,$buffer); fwrite($target_file, $buffer); }
Таким образом, только небольшая часть файла сохраняется в памяти в любой момент времени. Я проверил эффективность, и это хорошо, около половины минут для всего файла.
Небольшая заметка: если замененная строка находится в конце буфера, она не может быть заменена. чтобы убедиться, что вы изменили все вхождения, снова запустите скрипт с небольшим смещением:
$buffer = fread($source_file, 512); fwrite($target_file, $buffer); while (!feof($source_file)) { $buffer = fread($source_file, 1024); // use a buffer of 1024 bytes $buffer = str_replace($old,$new,$buffer); fwrite($target_file, $buffer); }
В основном же, как и уже существующий ответ, но с указателями файлов.
$original = fopen("/tmp/inputfile.txt", "r"); $new = fopen("/tmp/outputfile.txt", "w"); if ($original && $new) { while (($buffer = fgets($handle)) !== false) { //do modification on $buffer (which is a single line) fwrite($new, $buffer); } fclose($original); fclose($new); }
Для выполнения аналогичной задачи я использую следующее:
$file = file_get_contents("/path/to/file"); $lines = explode("\n", $file); $arr = preg_grep("/search_string/", $lines); // $arr is now a smaller array of things to match // do whatever here // write back to file file_put_contents("/path/to/file", implode("\n", array_merge($arr, $lines)));
PHP не предназначен или не предназначен для этого. Возможно, вам захочется использовать Perl, или изменить текст в XML, или поместить его в базу данных.
Выполнение этого так, как вы планируете, означает, что весь файл будет загружен в память. Если у вас есть несколько пользователей, делающих то же самое, у вас будет очень мало памяти.
Для синтаксического анализа XML смотрите здесь XMLReader