C, parse comma-separated line
Apr. 22nd, 2012 06:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Кошерен ли такой код для разбиения строки, разделенной запятыми на отдельные строки: http://ideone.com/rhNXq ?
PS: strtok не признаю по идеологическим причинам - она меняет анализируемую строку, что меня крайне пугает, хотя в моем конкретном случае это не мешает.
PPS: безотносительно к strtok, в функции было минимум две ошибки - отсутствие проверки на выход за пределы буфера и попадание eol в последнюю строку (девайсина, с которой приходит строка, терминирует ее \r)
PS: strtok не признаю по идеологическим причинам - она меняет анализируемую строку, что меня крайне пугает, хотя в моем конкретном случае это не мешает.
PPS: безотносительно к strtok, в функции было минимум две ошибки - отсутствие проверки на выход за пределы буфера и попадание eol в последнюю строку (девайсина, с которой приходит строка, терминирует ее \r)
no subject
Date: 2012-04-22 03:09 pm (UTC)no subject
Date: 2012-04-22 03:13 pm (UTC)no subject
Date: 2012-04-22 03:17 pm (UTC)no subject
Date: 2012-04-22 03:13 pm (UTC)no subject
Date: 2012-04-22 03:14 pm (UTC)no subject
Date: 2012-04-22 03:15 pm (UTC)no subject
Date: 2012-04-22 03:15 pm (UTC)Решение топикстартера тоже особо на подкачку не рассчитано
no subject
Date: 2012-04-22 04:07 pm (UTC)no subject
Date: 2012-04-22 04:43 pm (UTC)no subject
Date: 2012-04-22 05:13 pm (UTC)no subject
Date: 2012-04-22 07:11 pm (UTC)Однако там довольно много важных замечаний о свойствах и поведении алгоритмов в условиях различной стоимости доступа к данным и коду, по крайней мере во втором издании (2011 года).
no subject
Date: 2012-04-22 04:42 pm (UTC)no subject
Date: 2012-04-22 04:44 pm (UTC)no subject
Date: 2012-04-22 04:51 pm (UTC)no subject
Date: 2012-04-22 05:24 pm (UTC)no subject
Date: 2012-04-22 07:42 pm (UTC)$csv = Text::CSV->new({binary => 1, sep_char => ';'});
$status = $csv->parse($_);
foreach $f ($csv->fields()){
....
}
no subject
Date: 2012-04-22 05:28 pm (UTC)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, []}.
no subject
Date: 2012-04-22 04:58 pm (UTC)no subject
Date: 2012-04-22 05:24 pm (UTC)no subject
Date: 2012-04-22 05:27 pm (UTC)