Driver86
@Driver86
Немодератор toster.ru

Как читать файл построчно, учитывая, что символ перевода строки может экранироваться, в том числе и сам символ экранирования?

Я сделал так:

protected function getFields(string $filePath): \Generator
{
    $file = new SplFileObject($filePath);
    $line = '';
    foreach ($file as $buffer) {
        if (substr($buffer, -2) == "\\\n") {
            $line .= substr($buffer, 0, -2) . "\n";
                continue;
        }
        yield $line;
    }
}


НО: это не учитывает случай, когда сам символ экранирования экранируется. Например, дан такой файл для чтения:

qwerty\\
asdfgh


Ожидание:

[
    "qwerty\\",
    "asdfgh",
]


Реальность:

[
    "qwerty\
asdfgh",
]


Как решить проблему?
Никаких идей, кроме посимвольного чтения файла у меня пока нет. Но это, подозреваю, будет очень медленно. Тогда лучше читать файл кусками через fread, затем в оперативной памяти его посимвольно читать, и, после найденного неэкранированного символа перевода, отбрасывать "лишнее".
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ilyale
символ перевода строки не может быть экранирован. он либо есть, либо его нет, это же системный символ.

Рекомендую читать файл построчно. Раз вы начали парсить файл, как объект, так и продолжайте, используя, например getTargetType. Метод вернет вам строку уже без символа перевода строки.

Дальше разбиваете строку, используя разделители и функцию Explode

Затем полученные элементы массива можно "причесать", избавившись от слешей и прочего мусора, используя, например, array_walk или что-то другое
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Priceva Москва
от 100 000 до 140 000 руб.
Zelo Москва
от 130 000 руб.
Amigoweb Магнитогорск
от 40 000 до 60 000 руб.