3

単純なテキスト ファイルから整数値を読み込もうとしています。入力ファイルの行は次のようになります。

1 4 15 43
2 4 12 33
... (many rows of 4 integers)

次の方法でファイルを開きました。

{ok, IoDev} = file:open("blah.txt",[read])

しかし、私がなんとか読み取れたのは、利用可能なすべての機能を備えたバイトだけです。

ファイルから最終的に取得したいのは、整数のタプルです。

{1 4 15 43}
{2 4 12 33}
...
4

2 に答える 2

3

最初に を使用file:read_line/1してテキスト行を読み取り、 を使用re:split/2して数値を含む文字列のリストを取得する必要があります。次に、list_to_integerBIF を使用して整数を取得します。

以下に例を示します (確かに、より良い解決策があります)。

#!/usr/bin/env escript
%% -*- erlang -*-

main([Filename]) ->
    {ok, Device} = file:open(Filename, [read]),
    read_integers(Device).

read_integers(Device) ->
    case file:read_line(Device) of
    eof ->
        ok;
    {ok, Line} ->
        % Strip the trailing \n (ASCII 10)
        StrNumbers = re:split(string:strip(Line, right, 10), "\s+", [notempty]),
        [N1, N2, N3, N4] = lists:map(fun erlang:list_to_integer/1, 
                     lists:map(fun erlang:binary_to_list/1, 
                           StrNumbers)), 
        io:format("~w~n", [{N1, N2, N3, N4}]),
        read_integers(Device)
    end.

(編集)

io:freadフォーマットされた入力を読み取るために使用する、やや単純なソリューションを見つけました。あなたの場合はうまくいきますが、ファイルの構成が悪いとうまくいきません。

#!/usr/bin/env escript
%% -*- erlang -*-

main([Filename]) ->
    {ok, Device} = file:open(Filename, [read]),
    io:format("~w~n", [read_integers(Device)]).

read_integers(Device) ->
    read_integers(Device, []).

read_integers(Device, Acc) ->
    case io:fread(Device, [], "~d~d~d~d") of
    eof ->
        lists:reverse(Acc);
    {ok, [D1, D2, D3, D4]} ->
        read_integers(Device, [{D1, D2, D3, D4} | Acc]);
    {error, What} ->
        io:format("io:fread error: ~w~n", [What]),
        read_integers(Device, Acc)
    end.
于 2012-04-24T10:21:02.327 に答える
2

編集部分を見ていない

/*

fread/3を試すことができます

read() ->
{ok, IoDev} = file:open("x", [read]),
read([], IoDev).

read(List, IoDev) ->
case io:fread(IoDev, "", "~d~d~d~d") of
{ok, [A,B,C,D]} ->
    read([{A,B,C,D} | List], IoDev);
eof ->
    lists:reverse(List);
{error, What} ->
    failed
end.

*/

于 2012-04-24T10:54:54.437 に答える