metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-22 06:05 pm

C, parse comma-separated line

Кошерен ли такой код для разбиения строки, разделенной запятыми на отдельные строки: http://ideone.com/rhNXq ?

PS: strtok не признаю по идеологическим причинам - она меняет анализируемую строку, что меня крайне пугает, хотя в моем конкретном случае это не мешает.

PPS: безотносительно к strtok, в функции было минимум две ошибки - отсутствие проверки на выход за пределы буфера и попадание eol в последнюю строку (девайсина, с которой приходит строка, терминирует ее \r)

[identity profile] blacklion.livejournal.com 2012-04-22 03:09 pm (UTC)(link)
man strsep strtok

[identity profile] metaclass.livejournal.com 2012-04-22 03:13 pm (UTC)(link)
Про них какие-то неприятные вещи в man написаны, меня идея модифицировать строку ради парсинга крайне пугает.

[identity profile] blacklion.livejournal.com 2012-04-22 03:17 pm (UTC)(link)
Есть ещё strcspn() и strspn() и strpbrk()
Edited 2012-04-22 15:18 (UTC)

[identity profile] dair-spb.livejournal.com 2012-04-22 03:13 pm (UTC)(link)
Как предлагаешь парсить потенциальный гигабайт?

[identity profile] gds.livejournal.com 2012-04-22 03:14 pm (UTC)(link)
итератами, чо.

[identity profile] gds.livejournal.com 2012-04-22 03:15 pm (UTC)(link)
ну да, и не через strхуйню.

[identity profile] blacklion.livejournal.com 2012-04-22 03:15 pm (UTC)(link)
mmap()? :)
Решение топикстартера тоже особо на подкачку не рассчитано

[identity profile] avnik.livejournal.com 2012-04-22 04:07 pm (UTC)(link)
Кстати -- а куда бы посмотреть на предмет "загрузить большой файл с radix tree mmap'ом и поискать там чего"? (не в плане супер-реализации, а скорее чего попроще, чтобы понять как такое работает)
abbra: (Default)

[personal profile] abbra 2012-04-22 04:43 pm (UTC)(link)
Knuth, Donald. E. [1998]. The Art of Computer Programming, Volume 3, Sorting and Searching. Addison-Wesley, Reading, Massachusetts.

[identity profile] avnik.livejournal.com 2012-04-22 05:13 pm (UTC)(link)
Хм, а там про mmap есть? ;)
abbra: (Default)

[personal profile] abbra 2012-04-22 07:11 pm (UTC)(link)
Нет :)
Однако там довольно много важных замечаний о свойствах и поведении алгоритмов в условиях различной стоимости доступа к данным и коду, по крайней мере во втором издании (2011 года).

[identity profile] w00dy.livejournal.com 2012-04-22 04:42 pm (UTC)(link)
strsep и strtok разруливают ситуацию с экранированием? Нет? Тогда в печку их.

[identity profile] blacklion.livejournal.com 2012-04-22 04:44 pm (UTC)(link)
А этот код разруливает? Вообще, приличного кода с полной поддержкой shell words я как-то не видел ни разу.

[identity profile] metaclass.livejournal.com 2012-04-22 04:51 pm (UTC)(link)
Написать нормальный парсер CSV с экранированием это та еще задача. Можно давать на собеседовании и издеваться.

[identity profile] http://users.livejournal.com/_slw/ 2012-04-22 07:42 pm (UTC)(link)
use Text::CSV;
$csv = Text::CSV->new({binary => 1, sep_char => ';'});
$status = $csv->parse($_);
foreach $f ($csv->fields()){
....
}

[identity profile] lionet.livejournal.com 2012-04-22 05:28 pm (UTC)(link)
На Эрланге примерно так:

extract_value([]) -> novalue;
extract_value([$\r,$\n|Rest]) -> {Rest};
extract_value([$\n|Rest]) -> {Rest};
extract_value([$"|Rest]) -> extract_quoted(Rest, []);
extract_value(Rest) -> extract_nonquoted(Rest, []).

extract_nonquoted([$\n|_]=Rest, V) -> {V, Rest};
extract_nonquoted([$\r,$\n|_]=Rest, V) -> {V, Rest};
extract_nonquoted([$,|Rest], V) -> {V, Rest};
extract_nonquoted([C|Rest], V) -> extract_nonquoted(Rest, [C|V]);
extract_nonquoted([], V) -> {V, []}.

extract_quoted([$",$,|Rest], V) -> {V, Rest};
extract_quoted([$",$\r,$\n|Rest], V) -> {V, [$\n|Rest]};
extract_quoted([$",$\n|Rest], V) -> {V, [$\n|Rest]};
extract_quoted([$",$"|Rest], V) -> extract_quoted(Rest, [$"|V]);
extract_quoted([$"], V) -> {V, []};
extract_quoted([$\r,$\n|Rest], V) -> extract_quoted(Rest, [$\n|V]);
extract_quoted([C|Rest], V) -> extract_quoted(Rest, [C|V]);
extract_quoted([], V) -> {V, []}.

[identity profile] blacklion.livejournal.com 2012-04-22 05:24 pm (UTC)(link)
Смотреть надо — понимает ли он заэскейпленные кавычки в кавычках и прочее.

[identity profile] lionet.livejournal.com 2012-04-22 05:27 pm (UTC)(link)
Понимает. И прочее.