Как читать файл построчно, учитывая, что символ перевода строки может экранироваться, в том числе и сам символ экранирования? Я сделал так: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, затем в оперативной памяти его посимвольно читать, и, после найденного неэкранированного символа перевода, отбрасывать "лишнее".

21 Авг 2019 в 06:28
153 +1
0
Ответы
1

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

Вот пример такого подхода:

protected function getFields(string $filePath): \Generator
{
$file = new SplFileObject($filePath);
$line = '';
foreach ($file as $buffer) {
$buffer = preg_replace('/\\\\/', '\', $buffer); // Заменяем двойные обратные слеши на другой символ
if (substr($buffer, -2) == "\\n") {
$line .= substr($buffer, 0, -2) . "\n";
continue;
}
yield str_replace('\', '\\', $line); // Возвращаем обратно замененные символы
}
}

Таким образом, вы можете использовать регулярные выражения для обработки символов экранирования в файле перед его построчным чтением.

20 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 956 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир