csvファイルのデータをmnesiaデータベース(具体的には「user」という名前のテーブル)に保存したい
私はこのフォーラムでこの種の解決策を見つけました:
csv.erlという名前のファイルを作成します。
%%% --- csv parser in Erlang. ------
%%% To help process large csv files without loading them into
%%% memory. Similar to the xml parsing technique of SAX
-module(csv).
-compile(export_all).
parse(FilePath,ForEachLine,Opaque)->
case file:open(FilePath,[read]) of
{_,S} ->
start_parsing(S,ForEachLine,Opaque);
Error -> Error
end.
start_parsing(S,ForEachLine,Opaque)->
Line = io:get_line(S,''),
case Line of
eof -> {ok,Opaque};
"\n" -> start_parsing(S,ForEachLine,Opaque);
"\r\n" -> start_parsing(S,ForEachLine,Opaque);
_ ->
NewOpaque = ForEachLine(scanner(clean(clean(Line,10),13)),Opaque),
start_parsing(S,ForEachLine,NewOpaque)
end.
scan(InitString,Char,[Head|Buffer]) when Head == Char ->
{lists:reverse(InitString),Buffer};
scan(InitString,Char,[Head|Buffer]) when Head =/= Char ->
scan([Head|InitString],Char,Buffer);
scan(X,_,Buffer) when Buffer == [] -> {done,lists:reverse(X)}.
scanner(Text)-> lists:reverse(traverse_text(Text,[])).
traverse_text(Text,Buff)->
case scan("",$,,Text) of
{done,SomeText}-> [SomeText|Buff];
{Value,Rem}-> traverse_text(Rem,[Value|Buff])
end.
clean(Text,Char)->
string:strip(string:strip(Text,right,Char),left,Char).
機能テストの作成:
test()->
ForEachLine = fun(Line,Buffer)-> io:format("Line: ~p~n",[Line]),Buffer end,
InitialBuffer = [],
csv:parse("/home/include/user.csv",ForEachLine,InitialBuffer).
しかし、このソリューションはErlangコンソールにデータのみを表示します(csvファイルの各行を表示します)が、私の目標は、これらの行をcsvファイルのユーザーテーブルに保存することです。
私はすでにユーザーの記録を作成しました
-record(user, {id, firstname, lastname, birthday}).
csvファイルからユーザーテーブルへの行を登録するには
test()->
ForEachLine = fun(Line,Buffer)-> io:format("Line: ~p~n",[Line]),Buffer end,
InitialBuffer = [],
csv:parse("/home/test/user.csv",ForEachLine,InitialBuffer),
F = fun() ->
Line=#user{},
mnesia:write(Line),
{ok}
end,
{atomic, Val} = mnesia:transaction(F),
Val.
ただし、この関数はユーザーテーブルにデータを挿入しません