Как отсортировать данные в текстовом файле?

#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. Пять лет спустя, и я хотел бы проголосовать за это дважды. 🙂