【问题标题】:Transfer data in .txt file in erlang在erlang中传输.txt文件中的数据
【发布时间】:2013-03-01 14:00:21
【问题描述】:

我在二郎中工作

现在,我有一个大问题

我想从一个表 mnesia 中获得一个日志,这个日志应该写在 excel 文件中

所以目标是将数据从表mnesia写入excel文件

我认为这与在这个论坛中找到的一些代码有关,最好的方法是编写 .txt 文件,然后将数据从 .txt 文件传输到 excel 文件

我在这个论坛的link 中找到了这个代码。

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

但是这段代码会产生错误

【问题讨论】:

标签: erlang


【解决方案1】:

在你提到的主题中,我说我没有测试代码,当然有语法错误。 这是一个运行的代码。

1> ok = mnesia:create_schema([node()]).
ok
2> rd(my_user,{firstname,lastname,age}).
my_user
3> ok =application:start(mnesia).
ok
4> {atomic,ok} = mnesia:create_table(my_user,[{attributes,record_info(fields,my_user)},{disc_copies,[node()]},{type,bag}]).
{atomic,ok}
5> Add_user = fun(Fn,Ln,Ag) ->
5>      F = fun() -> mnesia:write(my_user,#my_user{firstname=Fn,lastname=Ln,age=Ag},write) end,
5>      mnesia:activity(transaction,F)
5> end.
#Fun<erl_eval.18.82930912>
6> ok = Add_user("Georges","Boy",25).
ok
7> ok = Add_user("Joe","Armstrong",52).
ok
8> ok = Add_user("Pascal","Me",55).
ok
9> F = fun(T) -> mnesia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end.
#Fun<erl_eval.6.82930912>
10> {atomic,L} = mnesia:transaction(F,[my_user]).
{atomic,[#my_user{firstname = "Pascal",lastname = "Me",
                  age = 55},
         #my_user{firstname = "Joe",lastname = "Armstrong",age = 52},
         #my_user{firstname = "Georges",lastname = "Boy",age = 25}]}
11> ok = file:write_file("test.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || #my_user{firstname = F1, lastname = F2, age = F3} <- L]).
ok
12>

您的工作目录中将有一个名为 test.txt 的文件,其中包含

"Pascal"    "Me"    55
"Joe"   "Armstrong" 52
"Georges"   "Boy"   25

如果你用excel打开它你会得到

但这不是你应该直接使用的代码序列。

  • 第 1 行应出现在用于部署应用程序的代码中。
  • 第 2 行是一个记录定义,shell 必须了解下一行。它应该被模块或包含文件中的 -record(...) 替换。
  • 第 3 行和第 4 行应在更高级别主管之一的 init 函数中进行(通过一些测试来检查已启动的应用程序、现有表...)
  • 第 5 行应该在服务器的接口定义中
  • 第 6,7,8 行应由某些客户端中的用户界面生成
  • 最后一行 9,10,11 在另一个界面中(对于管理员?)。

致 Lost_with_coding 和他的同事们的消息,

如果我可以给你我的意见,你正在燃烧步骤。您应该专注于掌握 Erlang 语法、模式匹配和变量边界的概念......在您应该了解更高级的构造(例如列表和二进制推导式)之后。花时间查看错误消息并使用它们来解决简单的问题。 Erlang 官方文档非常适合此目的。我总是在我的浏览器中打开它,有时我在寻找我不知道的功能时也会使用这个链接http://erldocs.com/R15B/

接下来会出现高阶函数、错误处理、进程、并发、OTP...以及高效但不性感的 Erlang 工具(tv、appmon、调试器...)的使用。

我经常推荐它,但是使用奇妙的 Fred Hebert 的网站http://learnyousomeerlang.com/ 并一步一步地跟随它,重写代码,而不是复制/粘贴;这真的值得付出努力。

【讨论】:

    【解决方案2】:

    正如所评论的,link 本身清楚地解释了问题。如果你想要代码,那么就在这里。但是在直接跳入代码之前请理解。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      相关资源
      最近更新 更多