Адъ CSV

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

Date: 2009-11-09 09:12 pm (UTC)
From: [identity profile] metaclass.livejournal.com
У меня нет строки целиком. Есть входные символы, из потока. Т.е. обрабатывать нужно классическим конечным автоматом :)
Поиск делимитера по позициям ломается на делимитерах внутри кавычек.
И обрабатываю я не одну строку а все строки подряд, потому что у меня может быть такое:
"test
test"
и это должно вернуться в виде одной строки внутри списка, с \r\n внутри

Date: 2009-11-09 09:44 pm (UTC)
From: [identity profile] lionet.livejournal.com
Зачем "нужно" классическим? Можно BNF-based парсером. yacc/lex, no?

Date: 2009-11-09 09:47 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Можно и им, но мне быстрее обычный конечный автомат было сделать на дотнете, чем искать кодогенератор и придумывать грамматику.

Date: 2009-11-09 09:49 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
нафига там автомат?
там кроме одного флага и значения предыдущего символа ничего не нужно

Date: 2009-11-09 09:55 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Вот я до проверки значения предыдущего символа не додумался - вместо этого использовал состояние конечного автомата.

Date: 2009-11-09 09:59 pm (UTC)
From: [identity profile] lionet.livejournal.com
Предыдущий символ будет пробел. И что получится?

Date: 2009-11-09 10:03 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В том алгоритме на С, что ниже - добавится в выходную строку.
Вроде бы по стандарту, он должен игнорироваться, если около разделителей, а внутри строки недопустим.

Date: 2009-11-09 11:44 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
Стандарт ломало читать :)
Обработка пробелов - вообще не проблема.

Date: 2009-11-09 11:46 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
А вот про конец строки я забыл :(

Date: 2009-11-10 08:13 am (UTC)
From: [identity profile] metaclass.livejournal.com
Вот про это я и говорю - сколько не делаю, обязательно что нибудь забуду :)

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. 30th, 2025 03:45 am
Powered by Dreamwidth Studios