#php #text-files #fwrite
#php #текстовые файлы #fwrite
Вопрос:
Я сгенерировал текстовый файл. Как сортировать строки в нем по первому номеру раньше |
?
Он имеет структуру, подобную:
1|5
4|7
2|3
3|1
Я пытаюсь так, но это показывает ошибку. Полный код:
$str='';
foreach ($_POST['answer'] as $num => $answer) {
$str.="$num|".rtrim($answer)."rn";
}
$data = explode("n",$str);
sort($data,SORT_NUMERIC);
$date=date('y-m-d_H-i-s');
$fp=fopen("output/".$date."_out.txt", "w ");
$write=fwrite($fp, $data);
fclose($fp);
if ($write) echo 'Done!';
Комментарии:
1.
$data
является массивом во времяfwrite
вызова, в то времяfwrite
как требуется строка. Попробуйте:$write = fwrite($fp, implode("n",$data));
2. Спасибо! Это работа! Но перед первой строкой и после второй строки добавлен какой-то символ. Как это изменить?
3. Это: s017.radikal.ru/i409/1110/5b/4aa44ed12d42.bmp
4. Ах, измените все экземпляры
"n"
на"rn"
— я не знал, что вы используете Windows. Вы также можете захотетьtrim($str);
Ответ №1:
$file = file('path/to/file');
sort($file, SORT_NUMERIC);
fwrite('path/to/file', join("n", $file));
Ответ №2:
$data = trim(file_get_contents('file'));
$data = explode("n",$data);
sort($data,SORT_NUMERIC);
$data = implode("n",$data);
Комментарии:
1. Спасибо, но не работает (
Error: Warning: fwrite() expects parameter 2 to be string
2. Вы пытаетесь записать массив в файл. Попробуйте
file_put_contents('filename',implode("n",$data));
Ответ №3:
Это, безусловно, самое быстрое и элегантное решение, которое я нашел, когда у меня была такая же проблема. Если вы используете Linux (с разрешенным exec в конфигурации PHP), вы можете сделать следующее (при условии, что вы хотите сортировать файлы численно):
exec("sort -n " . $pathToOriginalFile . " > " . $pathToSortedFile);
По сути, выполните команду bash sort, которая сортирует строки в файле численно.
Если вы хотите сохранить данные в исходном файле, сделайте это:
exec("sort -n " . $pathToOriginalFile . " > " . $pathToSortedFile);
exec("rm " . $pathToOriginalFile);
exec("mv " . $pathToSortedFile . " " . $pathToOriginalFile);
Если вам нужна сортировка по алфавиту, просто исключите опцию -n (—numeric-sort).
exec("sort " . $pathToOriginalFile . " > " . $pathToSortedFile);
Для меня команде потребовалось около 3 секунд, чтобы отсортировать 10 миллионов строк в файле на сервере.
Вы можете найти больше о сортировке здесь http://www.computerhope.com/unix/usort.htm
Надеюсь, это поможет.
Комментарии:
1. Пять лет спустя, и я хотел бы проголосовать за это дважды. 🙂