将数据从mnesia导出到excel
我有一个表用户将数据从mnesia导出到excel,excel,erlang,mnesia,Excel,Erlang,Mnesia,我有一个表用户 -record(person, {id, firstname, lastname}). 此表包含以下值: 1 francoi mocci 2 test tes 我的目标是如何将这些数据从mnesia导出到excel 我知道将数据从excel传输到mnesia的相反方法 这种情况下的解决方案是在csv.file中转换excel,然后使用此类代码解析csv文件: %%% --- csv parser in Erlang.
-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]).
此错误与此行有关:
#person{id = F1,firstname = F2,lastname = F3} <- L]).
{atomic,L} = mnesia:transaction(F),
此错误与此行有关:
#person{id = F1,firstname = F2,lastname = F3} <- L]).
{atomic,L} = mnesia:transaction(F),
我用以下方法解决了这个问题:
但是,当我运行函数时,出现以下错误:
syntax error before : '.'
variable 'F' is unbound
** 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
我尝试使用以下代码:
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]).
但我也有一个错误:
syntax error before : '.'
variable 'F' is unbound
** 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
您可以使用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]),
...
您忘记了第一行的结尾:
F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end,
老实说,我知道将数据从excel传输到mnesia的相反方法,但我没有找到将数据从mnesia传输到excel的解决方案如果无法将数据从mnesia导出到excel,我想知道是否可以将数据从mnesia导出到sql,如果可能,在将数据从mnesia导出到sql之后,我可以将dat从sql导出到Excel如果可以将其导出到textfile,您可以使用创建Excel工作表。首先感谢您的回答,但是我们如何将其导出到textfile,因为我已经说过我做了相反的事情:将数据从excel传输到mnesia,但现在我想将数据从mnesia导出到excelheard.csv?这就是数据从erlang轻松传输到Excel的方式谢谢你的回答,但是我有一个与函数语法相关的错误,我更新了我的问题我没有设置mnesia数据库,所以我无法真正测试我发布的代码。我做了一些更正,现在应该可以工作了。感谢您的回复,但是当我测试我的函数时,我出现了以下错误:Erlang R13B03 erts-5.7.4[source][rq:1][async threads:0][hipe][kernel poll:false]Eshell V5.7.4使用^G 1>模型:test中止。**异常错误:未定义函数mensia:foldl/3 in function model:test/0 2>我想知道这个问题是否取决于erlang版本,现在我使用的是erlang版本13谢谢,但我现在有一个错误:变量“F”未绑定,我已更新了代码重新检查我编写的内容。在第一行结束!不是在最后一个!我在运行函数测试时出错,我更新了代码这是因为您必须在mnesia:transaction/1中使用0-arity函数。从F中删除T参数,并在mnesia:foldl/3的第三个参数中写入表名。首先感谢您的回答,我遵照您的建议,但我有相同的错误,我更新了代码