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