我需要解析文本文件。这个文件在 post param. 我有这样的代码:
upload_file('POST', []) ->
File = Req:post_param("file"),
接下来我该怎么办?如何解析它?
我需要解析文本文件。这个文件在 post param. 我有这样的代码:
upload_file('POST', []) ->
File = Req:post_param("file"),
接下来我该怎么办?如何解析它?
里面是什么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 都会看到的那样,只处理第一个并且可能大多数时候只处理上传的文件。如果同时上传更多文件,这些文件将被忽略。
答案实际上取决于“文件”的内容。例如,如果文件包含一个符合 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