0

我需要解析文本文件。这个文件在 post param. 我有这样的代码:

upload_file('POST', []) ->
    File = Req:post_param("file"),

接下来我该怎么办?如何解析它?

4

2 回答 2

3

里面是什么Req:post_param("file")

您假设它是文件的路径:您检查过 的值File吗?

无论如何,Req:post_files/0您可能正在寻找:

[{_, _FileName, TempLocation, _Size}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),

将文件留在临时位置也可能是一个坏主意,您最好找到一个更合适的位置来存储它们。


似乎该uploaded_file记录现在有 5 个字段(到现在为止 10 个月)。

这是更新后的示例,带有第五个字段:

[{_, _FileName, TempLocation, _Size, _Name}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),

哦,因为它是一个记录,所以即使定义再次更新,以下示例也应该有效:

[File|_] = Req:post_files(),
{ok,Data} = file:read_file(File#uploaded_file.temp_file),

另一个警告:上面的代码,正如任何 erlanger 都会看到的那样,只处理第一个并且可能大多数时候只处理上传的文件。如果同时上传更多文件,这些文件将被忽略。

于 2014-01-08T16:07:36.053 回答
1

答案实际上取决于“文件”的内容。例如,如果文件包含一个符合 erlang 语法的字符串,例如:

[{{20,4},0},
 {{10,5},0},
 {{24,1},0},
 {{22,1},0},
 {{10,6},0}].

可以使用以下代码阅读:

File = Req:post_param("file"),
{ok,B} = file:read_file(File),
{ok,Tokens,_} = erl_scan:string(binary_to_list(B)),
{ok,Term} = erl_parse:parse_term(Tokens),
%% at this point Term = [{{20,4},0},{{10,5},0},{{24,1},0},{{22,1},0},{{10,6},0}]

[编辑]

Erlang 库大部分时间使用元组作为返回值。它可以帮助管理正常情况和错误情况。在前面的代码中,所有行都仅与成功案例“模式匹配”。这意味着如果任何操作失败,它将崩溃。如果周围的代码出现错误,您将能够管理错误情况,否则该过程将简单地死报告一个不匹配错误。

我选择了这个实现,因为在这个级别的代码中,没有什么可以用来处理错误。{{badmatch,{error,enoent}}只是表示 的返回值file:read_file(File)不是{ok,B}预期的形式,而是 is {error,enoent},表示File当前路径中不存在该文件。

文件摘录

read_file(Filename) -> {ok, Binary} | {error, Reason}
Types:
Filename = name()
Binary = binary()
Reason = posix() | badarg | terminated | system_limit

Returns {ok, Binary}, where Binary is a binary data object that contains the contents of Filename, or {error, Reason} if an error occurs.

Typical error reasons:
enoent
    The file does not exist.
eacces
    Missing permission for reading the file, or for searching one of the parent directories.
eisdir
    The named file is a directory.
enotdir
    A component of the file name is not a directory. On some platforms, enoent is returned instead.
enomem
    There is not enough memory for the contents of the file.

在我看来,如果它是一个真实的用例,调用代码应该管理这种情况,例如File来自用户界面,或者如果这种情况不应该发生,则让错误不受管理。在你的情况下,你可以做

try File_to_term(Params) % call the above code with significant Params
catch
    error:{badmatch,{error,enoent}} -> file_does_not_exist_management();
    error:{badmatch,{error,eacces}} -> file_access_management();
    error:{badmatch,{error,Error}} -> file_error(Error)
end
于 2013-12-23T08:14:11.713 回答