Читайте в текстовом файле построчно php - новая строка не обнаруживается - PullRequest
33 голосов
/ 03 мая 2009

У меня есть написанная мной функция php, которая берет текстовый файл и выводит каждую строку в виде отдельной строки в таблице.

Проблема в том, что классика «отлично работает на моей машине», но, конечно, когда я прошу кого-то еще сгенерировать искомый файл .txt, он продолжает читать весь файл как одну строку. Когда я открываю его в своем текстовом редакторе, он выглядит так, как будто я ожидал, что с новым именем в каждой строке, но с символом новой строки или чем-то, что его отбрасывает.

Пока я пришел к выводу, что это может иметь какое-то отношение к любому текстовому редактору, который они используют в своей системе Mac.

Имеет ли это смысл? и есть ли какой-нибудь простой способ обнаружить этот символ, который текстовый редактор распознает как новую строку, и заменить его стандартным, который распознает php?

ОБНОВЛЕНИЕ: добавление следующей строки решило проблему.

ini_set('auto_detect_line_endings',true);

Функция:

function displayTXTList($fileName) {
    if(file_exists($fileName)) {
        $file = fopen($fileName,'r');
        while(!feof($file)) { 
            $name = fgets($file);
            echo('<tr><td align="center">'.$name.'</td></tr>');
        }
        fclose($file);
    } else {
        echo('<tr><td align="center">placeholder</td></tr>');
    }       
}

Ответы [ 4 ]

32 голосов
/ 03 мая 2009
11 голосов
/ 03 мая 2009

Что не так с file()?

foreach (file($fileName) as $name) {
    echo('<tr><td align="center">'.$name.'</td></tr>');
}
6 голосов
/ 03 мая 2009

Со страницы справочника fgets :

Примечание. Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение опции конфигурации auto_detect_line_endings во время выполнения может помочь решить проблему.

Кроме того, вы пробовали функцию file ? Возвращает массив; каждый элемент в массиве соответствует строке в файле.

Редактировать: если у вас нет доступа к php.ini, какой веб-сервер вы используете? В Apache вы можете изменить настройки PHP, используя .htaccess файл . Существует также функция ini_set , которая позволяет изменять настройки во время выполнения.

5 голосов
/ 03 мая 2009

Это классический случай проблемы перевода строки.

ASCII определяет несколько разных символов "новой строки". Два конкретных, которые нас интересуют, это ASCII 10 (перевод строки, LF) и 13 (возврат каретки, CR).

Все системы на основе Unix, включая OS X, Linux и т. Д., Будут использовать LF в качестве новой строки. Mac OS Classic использовала CR просто для отличия, а Windows использует CR LF (верно, два символа для новой строки - посмотрите, почему никто не любит Windows? Просто шучу) в качестве новой строки.

Следовательно, текстовые файлы от кого-то на Mac (при условии, что это современная ОС) будут иметь LF в качестве окончания строки. Если вы пытаетесь прочитать их в Windows, и Windows ожидает CR LF, он не найдет его. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,,,, * * * * * * * * * * * *,,

$file = file_get_contents("filename");
$array = split("/\012\015?/", $file); # won't work for Mac Classic

Конечно, вы можете сделать то же самое с file() (, как уже упоминалось ).

...