【发布时间】:2010-12-04 15:53:41
【问题描述】:
对于我的应用程序,我必须使用 Erlang 解析 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-因为代码使用双引号 ("") 和逗号 (,) 解析并分隔每个值..但在下面的示例中,如果 First name 包含其中的双引号字符串,则解析器将再创建一个字段。
"Type","First Name","Last Name","Email"
"Contact","Ashwani Garg ------"All Pain Will End."","","itisashwani4u@gmail.com"
result:-
[["contact"],["Ashwani Garg ------"],["All Pain Will End."],[],["itisashwani4u@gmail.com"]]
expected result:-
[["contact"],["Ashwani Garg ------All Pain Will End."],[],["itisashwani4u@gmail.com"]]
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/
【问题讨论】: