将文本文件的内容递归插入到mysql数据库Erlang中

时间:2013-12-17 18:10:44

标签: file list recursion erlang

我在递归地将.txt文件内容插入MySQL数据库时遇到问题。

现在我有一个函数读取.txt文件并从文件中获取特定行。它成功地将一个特定的行插入到List中,然后我将其插入到MySQL DB中,但是当我尝试从第1行转到n并且每行完成时我真的迷路了。

我已经尝试使用erlang:length()来收集列表的最大长度,并为每个插入的行减少一个,但它不会工作。我尝试过这样的事情。

start() ->
    Lines = into_list("Filepath"),
    LineNR = erlang:length(Lines),
    getLine(LineNR, Lines).

getLine(NewLineNR, List) when NewLineNR >= 0 ->
    NewNewLineNR = NewLineNR - 1,
    task(NewNewLineNR, List).

task(NewLineNR, List) ->      
    Line = line_nr( NewLineNR , List),
    [List] = string:tokens(Line, ","),
    Insert = [List],
    %%The insertion in the DB happens here
    insert_to_db(Insert),
    getLine(NewLineNR, List).

但它崩溃了,我不知道为什么。提示很感激!谢谢!

1 个答案:

答案 0 :(得分:1)

那么当NewLineNR = -1时会发生什么? Erlang会因为无法匹配任何getLine子句而烦恼。

虽然line_nr只是从列表中取出x行,但你可以做得更简单一点。在Erlang中,您可以使用模式匹配来控制程序流,而不是依赖于跟踪您正在使用的列表中的哪个项目:

start() ->
    Lines = into_list("Filepath"),
    task(Lines).

task([Head | Tail]) ->      
    TokensList = string:tokens(Head, ","),
    %%The insertion in the DB happens here
    insert_to_db(TokensList),
    task(Tail);

task([]) -> done.

此版本使用列表头/尾模式匹配来帮助递归列表。假设into_list只是将文件读入字符串列表,代码执行以下操作:

  1. 将文件读入列表
  2. 标记列表中的第一个条目
  3. 插入数据库
  4. 在列表的剩余部分重复2-3,直到列表为空。
  5. 当列表为空时返回done原子。