Как читать файл построчно, учитывая, что символ перевода строки может экранироваться, в том числе и сам символ экранирования? Я сделал так: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
169 +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 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир