для моего приложения я должен разобрать CSV файл, используя Erlang.following код, который будет анализировать CSV, используя Erlang: -CSV парсер в Эрл
parse_file(Fn) ->
{ok, Data} = file:read_file(Fn),
parse(binary_to_list(Data)).
parse(Data) -> lists:reverse(parse(Data, [])).
parse([], Acc) -> Acc;
parse(Data, Acc) ->
{Line, Tail} = parse_line(Data),
parse(Tail, [Line|Acc]).
parse_line(Data) ->
{Line, Tail} = parse_line(Data, []),
{lists:reverse(Line), Tail}.
parse_line([13,10|Data], Acc) -> {Acc, Data};
parse_line([10|Data], Acc) -> {Acc, Data};
parse_line([13|Data], Acc) -> {Acc, Data};
parse_line([], Acc) -> {Acc, []};
parse_line([$,,$,|Data], Acc) -> parse_line(Data, [""|Acc]);
parse_line([$,|Data], Acc) -> parse_line(Data, Acc);
parse_line(Data, Acc) ->
{Fld, Tail} = parse_field(Data),
parse_line(Tail, [Fld|Acc]).
parse_field([34|Data]) ->
{Fld, Tail} = parse_fieldq(Data, ""),
{lists:reverse(Fld), Tail};
parse_field(Data) ->
{Fld, Tail} = parse_field(Data, ""),
{lists:reverse(Fld), Tail}.
parse_field([$,|Tail], Acc) -> {Acc, [$,|Tail]};
parse_field([13|Tail], Acc) -> {Acc, [13|Tail]};
parse_field([10|Tail], Acc) -> {Acc, [10|Tail]};
parse_field([], Acc) -> {Acc, []};
parse_field([Ch|Tail], Acc) -> parse_field(Tail, [Ch|Acc]).
parse_fieldq([34,34|Tail], Acc) -> parse_fieldq(Tail, [34|Acc]);
parse_fieldq([34|Tail], Acc) -> {Acc, Tail};
parse_fieldq([Ch|Tail], Acc) -> parse_fieldq(Tail, [Ch|Acc]).
этот код работает отлично, но имеющие два вопроса: - 1 - так как анализ кода использует двойную кавычку ("") и запятую (,) и разделяет каждое значение ... но в следующем примере, если первое имя состоит из двойного кавычки в нем, тогда синтаксический анализатор создаст еще одно поле.
"Type","First Name","Last Name","Email"
"Contact","Ashwani Garg ------"All Pain Will End."","","[email protected]"
result:-
[["contact"],["Ashwani Garg ------"],["All Pain Will End."],[],["[email protected]"]]
expected result:-
[["contact"],["Ashwani Garg ------All Pain Will End."],[],["[email protected]"]]
2-для следующего вида CSV его для значения, его усеченный некоторое значение: - Имя, Фамилия, Отчество, Имя, Ник, Адрес электронной почты, Улица, Город, Главная Почтовый индекс, Главная Государство, Главная Страна/регион, Домашний телефон, домашний факс, мобильный телефон, персональная веб-страница, бизнес-стрит, бизнес-город, бизнес-почтовый индекс, бизнес-статус, бизнес-страна/регион, веб-страница для бизнеса, бизнес-телефон, Бизнес-факс, пейджер, Компания, Должность, отдел, офис Адрес, Примечание
Affection,,,Affection,,,,,,,,+919845141544,,+919845141544,,,,,,,,,,,,,,,
result:-
[["Affection"],[],[],["Affection"],[],[],[],[],[],[],[],["+919845141544"],[],["+919845141544"],[],[],[],[],[],[],[]]
expected result:-
[["Affection"],[],[],["Affection"],[],[],[],[],[],[],[],["+919845141544"],[],["+919845141544"],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
Пожалуйста, помогите мне ... для пожалуйста, используйте Другой крупный по следующей ссылке: - http://ppolv.wordpress.com/2008/02/25/parsing-csv-in-erlang/
спасибо за ваши reply..i запустили вашего script..it работает хорошо и сортировка также, но проверить .. вывод [[ «Тип», «Имя», «Фамилия», "Электронная почта "], [[]], [" Контакт "," null ", []," [email protected] "], [[]] , но вы можете видеть, что есть одна [[]] коробка в каждой записи, которая не используется, мы можем избежать этого ... – Abhimanyu
ОК, я изменил код, чтобы поместить строки в дополнительный список. – Zed
** ошибка исключения: неопределенный файл функции: read_line/1 в функции csv_erl_parser: parse/1 – Abhimanyu