2

Excelファイルに保存されているデータがあります

このファイルには、名前と姓の 2 つの列が含まれています。

複数の行が含まれています

私の目標は、このデータをデータベース mnesia に登録することです (name と surname の 2 つの属性を含む person テーブル内)。

Excelファイルからmnesiaデータベースにデータを保存することは可能ですか

Excel ファイルから mnesia にデータをインポートできない場合は、ソース ファイル (Excel ファイル) を .sql または .txt に変換してから、このファイルを mnesia にインポートできますか?

4

3 に答える 3

2

最も簡単な方法は、Excelデータをcsvファイルにエクスポート/保存し、次のようなコードでerlangから解析することだと思います。

{ok, Data} = file:read_file("test.csv"),
ParsedData = lists:map(
    fun(Str) -> string:tokens(Str, ",") end,
    string:tokens(binary_to_list(Data), "\n")
),
lists:foreach(fun([K,V]) -> mnesia:write(K, V) end, ParsedData).
于 2013-01-16T11:16:54.683 に答える
0

このファイル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).

csv ファイルからデータを抽出する関数を作成します。

test()->

    ForEachLine = fun(Line,Buffer)-> io:format("Line: ~p~n",[Line]),Buffer end,

 InitialBuffer = [],

 csv:parse("/home/include/person.csv",ForEachLine,InitialBuffer).

erlang のコンソールでは、正しい結果が表示されます。

1> operation:test(). 
Line: ["50;97919861;5ab190537df;9898abb6e;efb65a0ad1;1",
       "35427;1",
       "3542;30-11-2012;testU2;testU6;undefined;m.;enabled;jjj;A999997;97979797;CIN;testU@gmail.com;b1088b51297846e;0;user;0;{{2012",
       "11","30}","{1","59",
       "26}};gggg;kkkk;ssss;standard;{2012","11",
       "30};hhhh;mmm;undefined;18;yyyy;nnnn;false;{{2012",
       "11","30}","{1","59","26}};1989;1;1"]
ok

今、私の目標は、このデータを mnesia データベースに登録することです (テーブル person 内)。

テーブルの人物には 49 の属性があります

この行を登録します

   Line: ["50;97919861;5ab190537df;9898abb6e;efb65a0ad1;1",
           "35427;1",
           "3542;30-11-2012;testU2;testU6;undefined;m.;enabled;jjj;A999997;97979797;CIN;testU@gmail.com;b1088b51297846e;0;user;0;{{2012",
           "11","30}","{1","59",
           "26}};gggg;kkkk;ssss;standard;{2012","11",
           "30};hhhh;mmm;undefined;18;yyyy;nnnn;false;{{2012",
           "11","30}","{1","59","26}};1989;1;1"]

この構造を持つ表 person で:

-record(person, {id, token, password, pin, key, salt, pin_salt, subscription_date, first_name, last_name, alias, gender, status,
                 taxid, formid, idcard, id_type, email, activation_code, email_confirmation, role,
                 trying, last_access, last_activity, last_activity_ip, last_activity_op_code, group, last_mod, last_login,
                 agent_code, agency_code, parent_id,pass_changes, pin_changes, is_merchant, created_at, birth_year, birth_month, birth_date}).
于 2013-01-23T11:40:38.663 に答える
0

Excelファイルをファイルとして変換する必要があり.csvます。CSV Parser次に、ここで提供されている iを使用できます: https://stackoverflow.com/a/10810660/431620。Excel からデータをインポートするのは非常に簡単で簡単です。 編集


そして、私は何かを忘れていました.上記で提供したCSVパーサーは、任意のファイルサイズを任意のerlangアプリケーションに解析できることを保証します. これは、一度にすべてのファイルをメモリに読み込むのではなく、ファイルをスキャンすることによって行われます。一度にファイルを読み取ろうとするコードを書くことに注意してください。大きなファイルは vm をクラッシュさせます。そのプログラムを使用して、SQL Server や Oracle などの他のデータベースから大きな csv ダンプ ファイルを Mnesia にインポートしました。

于 2013-01-17T07:36:01.610 に答える