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 или что-то другое
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы