gpt4 book ai didi

erlang 中的 csv 解析器

转载 作者:行者123 更新时间:2023-12-04 22:38:17 26 4
gpt4 key购买 nike

对于我的应用程序,我必须使用 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-因为代码使用双引号 ("") 和逗号 (,) 进行解析并分隔每个值..但在以下示例中,如果名字包含其中的双引号,那么解析器将再创建一个字段。
"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/

最佳答案

parse(File) ->
{ok, F} = file:open(File, [read, raw]),
parse(F, file:read_line(F), []).

parse(F, eof, Done) ->
file:close(F),
lists:reverse(Done);

parse(F, Line, Done) ->
parse(F, file:read_line(F), [parse_line(Line)|Done]).



parse_line(Line) -> parse_line(Line, []).

parse_line([], Fields) -> lists:reverse(Fields);
parse_line("," ++ Line, Fields) -> parse_field(Line, Fields);
parse_line(Line, Fields) -> parse_field(Line, Fields).

parse_field("\"" ++ Line, Fields) -> parse_field_q(Line, [], Fields);
parse_field(Line, Fields) -> parse_field(Line, [], Fields).

parse_field("," ++ _ = Line, Buf, Fields) -> parse_line(Line, [lists:reverse(Buf)|Fields]);
parse_field([C|Line], Buf, Fields) -> parse_field(Line, [C|Buf], Fields);
parse_field([], Buf, Fields) -> parse_line([], [lists:reverse(Buf)|Fields]).

parse_field_q(Line, Fields) -> parse_field_q(Line, [], Fields).
parse_field_q("\"\"" ++ Line, Buf, Fields) -> parse_field_q(Line, [$"|Buf], Fields);
parse_field_q("\"" ++ Line, Buf, Fields) -> parse_line(Line, [lists:reverse(Buf)|Fields]);
parse_field_q([C|Line], Buf, Fields) -> parse_field_q(Line, [C|Buf], Fields).

没有文件:read_line:
parse_file(File) ->
{ok, Data} = file:read_file(File),
parse(binary_to_list(Data), []).

parse([], Done) ->
lists:reverse(Done);

parse(Data, Done) ->
{Line, Rest} = case re:split(Data, "\r|\n|\r\n", [{return, list}, {parts, 2}]) of
[L,R] -> {L,R};
[L] -> {L,[]}
end,
parse(Rest, [parse_line(Line)|Done]).

关于erlang 中的 csv 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com