【问题标题】:export data from mnesia to excel将数据从 mnesia 导出到 excel
【发布时间】:2013-02-26 11:18:08
【问题描述】:

我有表用户

  -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

【问题讨论】:

  • 老实说,我知道相反的方式意味着将数据从 excel 传输到 mnesia ,但我没有找到将数据从 mnesia 传输到 excel 的解决方案
  • 如果不能将数据从mnesia导出到excel,我想知道是否可以将数据从mnesia导出到sql,如果可以从mnesia导出数据到sql后我可以导出dat从sql到excel
  • 如果您可以将其导出为文本文件,则可以使用XML Excel Standards 创建 Excel 工作表。
  • 首先感谢您的回答,但是我们如何将其导出到文本文件,因为我已经说过我已经做了相反的方式:将数据从 excel 传输到 mnesia 但目前我想从 mnesia 导出数据出类拔萃
  • 听说过.csv 吗?这就是将数据从 erlang 轻松传输到 excel 的方式

标签: excel erlang mnesia


【解决方案1】:

你忘记了第一行中的end

F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end,

【讨论】:

  • 谢谢,但我现在有这个错误:变量'F'未绑定,我已经更新了我的代码
  • 重新检查我写给你的内容。 end 在第一行!不是在最后一个!
  • 我在运行函数 test() 时出错,我更新了我的代码
  • 这是因为您必须在 mnesia:transaction/1 中使用 0-arity 函数。从F 中删除T 参数并在mnesia:foldl/3 的第三个参数中写入表名。
  • 首先谢谢你的回答,我听从了你的建议,但我有同样的错误,我更新了我的代码
【解决方案2】:

您可以使用 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]),
...

【讨论】:

  • 感谢您的回复,但我的函数语法有一个错误,我已经更新了我的问题
  • 我没有设置 mnesia 数据库,所以我无法真正测试我发布的代码。我做了一些更正,它现在应该可以工作了。
  • 感谢您的回复,但是当我测试我的功能时出现此错误:Erlang R13B03 (erts-5.7.4) [source] [rq:1] [async-threads:0] [ hipe] [kernel-poll:false] Eshell V5.7.4(使用 ^G 中止)1> 模型:测试()。 ** 异常错误:未定义函数 mensia:foldl/3 in function model:test/0 2>
  • 我想知道这个问题是否取决于 erlang 的版本,现在我使用 erlang 版本 13
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 2020-01-27
  • 2018-06-27
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多