0

テキストファイルを解析する必要があります。このファイルは post パラメーターにあります。次のようなコードがあります。

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 か月間)。

これは更新された例で、5 番目のフィールドがあります。

[{_, _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),

もう 1 つの警告: 上記のコードは、どのアーランガーにもわかるように、最初のファイルのみを処理し、おそらくほとんどの場合、アップロードされたファイルのみを処理します。同時に複数のファイルがアップロードされた場合、これらは無視されます。

于 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}{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 に答える