metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-11-09 08:28 pm

Адъ CSV

А напишите кто-нибудь табличку состояний CSV парсера? Т.е. последовательность символов, разделенных запятыми, в строках, разделенных \r или \r\n разбить на список списков строк. Если в строке должны быть служебные символы (т.е. запятая или \r \n) - строка обрамляется в кавычки, если внутри такой строки нужна кавычка - ставится две кавычки подряд.
На самом деле там немного сложнее, типа допустимо незначимые пробелы возле запятых, а значимыми их делают тоже через кавычки, управляющие символы <32 вроде тоже обязательно в кавычки, но это пофиг.
Вроде блин простая задачка, а каждый раз когда ее приходится делать - получаются на пару страниц конечные автоматы.

[identity profile] lionet.livejournal.com 2009-11-09 10:02 pm (UTC)(link)
incidentally, это табличка состояний. По вертикали идут состояния, по горизонтали — входные символы, меняющие состояния. После стрелки, соответственно, связанные действия.

[identity profile] metaclass.livejournal.com 2009-11-09 10:05 pm (UTC)(link)
Да, паттерн-матчинг спасает очень сильно. У меня была мысль его имитировать, но я забил :)

[identity profile] lionet.livejournal.com 2009-11-09 10:10 pm (UTC)(link)
Да ладно, на GNU C почти то же самое можно забубенить, если игнорировать \r\n/\n проблему :)

enum {
    ST_NOCHANGE,  /* Pseudo-state */
    ST_PLAIN,
    ST_QUOTED_VALUE,
    _ST_MAX
} stateTable[_ST_MAX][256] = {
    [ST_PLAIN] = {
        [ '"' ] = ST_QUOTED_VALUE,
        ...
    },
    [ST_QUOTED_VALUE] = { ... }
};