-1

私はテーブルユーザーを持っています

  -record(person, {id, firstname, lastname}).

この表には次の値が含まれます。

    1  francoi     mocci     
    2  test        tes  

私の目標は、このデータを mnesia から Excel にエクスポートする方法です

Excelからmnesiaへのデータ転送を意味する逆の方法を知っています

この場合の解決策は、csv.file で Excel を変換してから、この種のコードを使用して csv ファイルを解析することです。

%%% --- 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.


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 ファイルから mnesia にデータを挿入する関数の例です。

test()->

    ForEachLine = fun(Line,Buffer)->
   [Id, Firstname, Lastname] = Line,

                                    %% here insert each line to the table mnesia

                                     Buffer end,


 InitialBuffer = [],




 csv:parse("/home/test/Desktop/testt.csv",ForEachLine,InitialBuffer).

この例では問題はありませんでした

私はこのコードで試します:

test()->
    F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T),
{atomic,L} = mnesia:transaction(F),
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
                 #person{id = F1,firstname = F2,lastname = F3} <- L]).

しかし、私はこのエラーがあります:

syntax error before : '.' 

このエラーは次の行に関連しています:

#person{id = F1,firstname = F2,lastname = F3} <- L]).

私は自分のコードを次のように修正しようとしています:

test()->
    F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T),
{atomic,L} = mnesia:transaction(F),
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
                 #person{id = F1,firstname = F2,lastname = F3} <- L])end.

しかし、私は今このエラーがあります:

variable 'F' is unbound 

このエラーは次の行に関連しています:

{atomic,L} = mnesia:transaction(F),

私はこの問題を解決しました:

test()->
      F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T)end,
{atomic,L} = mnesia:transaction(F),
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
                 #person{id = F1,firstname = F2,lastname = F3} <- L]).

しかし、関数を実行すると、次のエラーが発生します。

** exception error: no match of right hand side value {aborted,{{badarity,{#Fun<model.20.69991685>,[]}},
                                                                [{mnesia_tm,apply_fun,3},
                                                                 {mnesia_tm,execute_transaction,5},
                                                                 {model,test,0},
                                                                 {erl_eval,do_apply,5},
                                                                 {shell,exprs,6},
                                                                 {shell,eval_exprs,6},
                                                                 {shell,eval_loop,3}]}}
     in function  model:test/0

私はこのコードで試します:

test()->
      F = fun() -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],person)end,
{atomic,L} = mnesia:transaction(F),
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
                 #person{id = F1,firstname = F2,lastname = F3} <- L]).

しかし、私もこのエラーがあります:

** exception error: no match of right hand side value {aborted,{undef,[{mensia,foldl,
                                                                               [#Fun<model.21.662230>,[],person]},
                                                                       {mnesia_tm,apply_fun,3},
                                                                       {mnesia_tm,execute_transaction,5},
                                                                       {model,test,0},
                                                                       {erl_eval,do_apply,5},
                                                                       {shell,exprs,6},
                                                                       {shell,eval_exprs,6},
                                                                       {shell,eval_loop,3}]}}
     in function  model:test/0
4

2 に答える 2

1

あなたは最初の行で忘れendました:

F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end,
于 2013-03-11T13:56:46.113 に答える
1

foldl 関数を使用してリストを作成し、このリストをファイルに書き込み、区切り文字として任意の文字 (レコードの内容に応じてスペース、コンマ、タブなど) を使用し、最後に Excel でテキスト ファイルを読み取ることができます。 Excel がデータを解釈する方法を制御するのに役立つポップアップ メニューが表示されます。ファイルへの直接書き込みはデータベース トランザクションに時間がかかる可能性があるため、中間リストを使用する方がよいと思います。

編集:申し訳ありませんが、私はその行をテストしていません...今すぐ動作するはずです。

...
F = fun(T) -> mnesia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end,
{atomic,L} = mnesia:transaction(F(mnesia_table)),
file:write_file("filename.txt",[io_lib:format("~p\t~p~n",[F1,F2]) || 
                 #table_record{field1 = F1,field2 = F2} <- L]),
...

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

于 2013-03-11T12:47:56.403 に答える