Guest User

Untitled

a guest
Apr 9th, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.69 KB | None | 0 0
  1. parse_file(Fn) ->
  2. {ok, Data} = file:read_file(Fn),
  3. parse(binary_to_list(Data)).
  4.  
  5. parse(Data) -> lists:reverse(parse(Data, [])).
  6.  
  7. parse([], Acc) -> Acc;
  8. parse(Data, Acc) ->
  9. {Line, Tail} = parse_line(Data),
  10. parse(Tail, [Line|Acc]).
  11.  
  12. parse_line(Data) ->
  13. {Line, Tail} = parse_line(Data, []),
  14. {lists:reverse(Line), Tail}.
  15.  
  16. parse_line([13,10|Data], Acc) -> {Acc, Data};
  17. parse_line([10|Data], Acc) -> {Acc, Data};
  18. parse_line([13|Data], Acc) -> {Acc, Data};
  19. parse_line([], Acc) -> {Acc, []};
  20. parse_line([$,,$,|Data], Acc) -> parse_line(Data, [""|Acc]);
  21. parse_line([$,|Data], Acc) -> parse_line(Data, Acc);
  22. parse_line(Data, Acc) ->
  23. {Fld, Tail} = parse_field(Data),
  24. parse_line(Tail, [Fld|Acc]).
  25.  
  26. parse_field([34|Data]) ->
  27. {Fld, Tail} = parse_fieldq(Data, ""),
  28. {lists:reverse(Fld), Tail};
  29. parse_field(Data) ->
  30. {Fld, Tail} = parse_field(Data, ""),
  31. {lists:reverse(Fld), Tail}.
  32.  
  33. parse_field([$,|Tail], Acc) -> {Acc, [$,|Tail]};
  34. parse_field([13|Tail], Acc) -> {Acc, [13|Tail]};
  35. parse_field([10|Tail], Acc) -> {Acc, [10|Tail]};
  36. parse_field([], Acc) -> {Acc, []};
  37. parse_field([Ch|Tail], Acc) -> parse_field(Tail, [Ch|Acc]).
  38.  
  39. parse_fieldq([34,34|Tail], Acc) -> parse_fieldq(Tail, [34|Acc]);
  40. parse_fieldq([34|Tail], Acc) -> {Acc, Tail};
  41. parse_fieldq([Ch|Tail], Acc) -> parse_fieldq(Tail, [Ch|Acc]).
  42.  
  43. "Type","First Name","Last Name","Email"
  44. "Contact","Ashwani Garg ------"All Pain Will End."","","itisashwani4u@gmail.com"
  45.  
  46. result:-
  47. [["contact"],["Ashwani Garg ------"],["All Pain Will End."],[],["itisashwani4u@gmail.com"]]
  48.  
  49. expected result:-
  50. [["contact"],["Ashwani Garg ------All Pain Will End."],[],["itisashwani4u@gmail.com"]]
  51.  
  52. Affection,,,Affection,,,,,,,,+919845141544,,+919845141544,,,,,,,,,,,,,,,
  53. result:-
  54. [["Affection"],[],[],["Affection"],[],[],[],[],[],[],[],["+919845141544"],[],["+919845141544"],[],[],[],[],[],[],[]]
  55. expected result:-
  56. [["Affection"],[],[],["Affection"],[],[],[],[],[],[],[],["+919845141544"],[],["+919845141544"],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
  57.  
  58. parse(File) ->
  59. {ok, F} = file:open(File, [read, raw]),
  60. parse(F, file:read_line(F), []).
  61.  
  62. parse(F, eof, Done) ->
  63. file:close(F),
  64. lists:reverse(Done);
  65.  
  66. parse(F, Line, Done) ->
  67. parse(F, file:read_line(F), [parse_line(Line)|Done]).
  68.  
  69.  
  70.  
  71. parse_line(Line) -> parse_line(Line, []).
  72.  
  73. parse_line([], Fields) -> lists:reverse(Fields);
  74. parse_line("," ++ Line, Fields) -> parse_field(Line, Fields);
  75. parse_line(Line, Fields) -> parse_field(Line, Fields).
  76.  
  77. parse_field(""" ++ Line, Fields) -> parse_field_q(Line, [], Fields);
  78. parse_field(Line, Fields) -> parse_field(Line, [], Fields).
  79.  
  80. parse_field("," ++ _ = Line, Buf, Fields) -> parse_line(Line, [lists:reverse(Buf)|Fields]);
  81. parse_field([C|Line], Buf, Fields) -> parse_field(Line, [C|Buf], Fields);
  82. parse_field([], Buf, Fields) -> parse_line([], [lists:reverse(Buf)|Fields]).
  83.  
  84. parse_field_q(Line, Fields) -> parse_field_q(Line, [], Fields).
  85. parse_field_q("""" ++ Line, Buf, Fields) -> parse_field_q(Line, [$"|Buf], Fields);
  86. parse_field_q(""" ++ Line, Buf, Fields) -> parse_line(Line, [lists:reverse(Buf)|Fields]);
  87. parse_field_q([C|Line], Buf, Fields) -> parse_field_q(Line, [C|Buf], Fields).
  88.  
  89. parse_file(File) ->
  90. {ok, Data} = file:read_file(File),
  91. parse(binary_to_list(Data), []).
  92.  
  93. parse([], Done) ->
  94. lists:reverse(Done);
  95.  
  96. parse(Data, Done) ->
  97. {Line, Rest} = case re:split(Data, "r|n|rn", [{return, list}, {parts, 2}]) of
  98. [L,R] -> {L,R};
  99. [L] -> {L,[]}
  100. end,
  101. parse(Rest, [parse_line(Line)|Done]).
  102.  
  103. "Type","First Name","Last Name","Email"
  104. "Contact","Ashwani Garg ------""All Pain Will End.""","","itisashwani4u@gmail.com"
  105.  
  106. parse(Data) -> parse(Data, [], [], []).
  107.  
  108. parse([$r|Data], Field, Fields, Lines) -> parse_r(Data, Field, Fields, Lines);
  109. parse([$n|Data], Field, Fields, Lines) -> parse(Data, [], [], [[Field|Fields]|Lines]);
  110. parse([$,|Data], Field, Fields, Lines) -> parse(Data, [], [Field|Fields], Lines);
  111. parse([$"|Data], [], Fields, Lines) -> parse_q(Data, [], Fields, Lines);
  112. parse([C|Data], Field, Fields, Lines) -> parse(Data, [C|Field], Fields, Lines);
  113. parse([], Field, Fields, Lines) ->
  114. lists:reverse(
  115. [lists:reverse(
  116. [lists:reverse(F) || F <- L]
  117. ) || L <- [[Field|Fields]|Lines]]
  118. ).
  119.  
  120. parse_r([$n|_] = Data, Field, Fields, Lines) -> parse(Data, Field, Fields, Lines).
  121.  
  122. parse_q([$"|Data], Field, Fields, Lines) -> parse_qq(Data, Field, Fields, Lines);
  123. parse_q([C|Data], Field, Fields, Lines) -> parse_q(Data, [C|Field], Fields, Lines).
  124.  
  125. parse_qq([$"|Data], Field, Fields, Lines) -> parse_q(Data, [$"|Field], Fields, Lines);
  126. parse_qq([C|_] = Data, Field, Fields, Lines)
  127. when C == $,; C == $r; C == $n -> parse(Data, Field, Fields, Lines);
  128. parse_qq([], Field, Fields, Lines) -> parse([], Field, Fields, Lines).
Add Comment
Please, Sign In to add comment