Адъ CSV

Nov. 9th, 2009 08:28 pm
metaclass: (Default)
[personal profile] metaclass
А напишите кто-нибудь табличку состояний CSV парсера? Т.е. последовательность символов, разделенных запятыми, в строках, разделенных \r или \r\n разбить на список списков строк. Если в строке должны быть служебные символы (т.е. запятая или \r \n) - строка обрамляется в кавычки, если внутри такой строки нужна кавычка - ставится две кавычки подряд.
На самом деле там немного сложнее, типа допустимо незначимые пробелы возле запятых, а значимыми их делают тоже через кавычки, управляющие символы <32 вроде тоже обязательно в кавычки, но это пофиг.
Вроде блин простая задачка, а каждый раз когда ее приходится делать - получаются на пару страниц конечные автоматы.

Date: 2009-11-10 07:17 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Твои предложения - чем парсить?
Как только ты сталкиваешься с ситуацией "быстро парсить поток байт" что льётся без остановки, спасают только автоматы (и то лишь в случае регулярных грамматик).
В остальных случаях нужны уже синтаксические анализаторы.

Рукописный лесосипед может требоваться в силу специфичности требований - таких как окружающий шум.

У меня при генерации мультиметодов нужно парсить содержимое комментариев. Но тут прикол в том, что парсеры эгоистичны - они парсят вход целиком.
Пришёл слабать автомат, что извлекает плюсовые комментарии из исходного кода.
Ничего сложного.

Автоматы простые как копейки, и умеют ээфективно парсить регулярные грамматики - в этом их сила.
Хоть, конечно, есть ньюансы применения, и конкретных реализацией автоматов чуть более, чем дохуя.

Но кодировать вручную иногда проще, чем искать хуй-пойми что.

Date: 2009-11-10 07:28 am (UTC)
From: [identity profile] vp.livejournal.com
Я все понимаю, но конкретно CSV - это вообще-то транспортный формат, и я вот хоть ты тресни, но не верю, что может быть такая ситуация, когда мне кровь из носу нужны уже распаршенные подстроки не дожидаясь окончания строки. Если я не прав - приведи мне плз реальный пример, для чего такое может быть.

Date: 2009-11-10 07:30 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Простой пример - очень длинные поля, буферизация которых не выгодна.
Тогда состояния позволяют обрабатывать блок, сразу его пересылать дальше или писать на диск, и лишь затем аккумулировать следующий блок.
Или вообще построить конвейер из параллельного чтения данных по сети, обработке данных (парсингу) и записи блоков на диск.
Так что всё не так просто.

Date: 2009-11-10 07:35 am (UTC)
From: [identity profile] vp.livejournal.com
очень длинные поля, буферизация которых не выгодна.

Я ВЕРЮ!!!!!
Я прошу живой пример из жизни конкретно под CSV, плиз! Я мозгом скриплю - банально не могу представить где такое может произойти. Ну можалуйсто! :)
Про бинарные и т.п. потоковые протоколы - без вопросов.

Date: 2009-11-10 07:36 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Представь, что между двумя запятыми 10 мегабайт.
И это ещё нормально, у нас вон в csv гигабайтные блобы экспортили из SyBase =)

Date: 2009-11-10 07:39 am (UTC)
From: [identity profile] vp.livejournal.com
А, ну вот в общем то ясно теперь, спасибо :) Паттерн сформировался :)

Date: 2009-11-10 07:41 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Ну, это лишь в твоём понимании "таблички из экселя", отдельные индивидумы таскают в нём гигабайты.
Кстати, это ничем и никем не запрещено - таскать толстые табличные данные в этом формате - универсально, просто, минимум накладных расходов (escaping запятой и перевода строки - мелочи).

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 29th, 2025 07:59 pm
Powered by Dreamwidth Studios