2012-04-24 15 views
3

単純なテキストファイルから整数値を読み取ろうとしています。私の入力ファイルの 行は次のようになります。私は、利用可能なすべての機能をバイトを読み取るために管理しているErlang:ファイルから整数を読み取る

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

しかし、唯一の事:

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

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

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

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

答えて

3

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

はここで(確かに、より良い解決策がある)例を示します

#!/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. 

(EDIT)

私は書式付き入力を読み取るために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. 
+0

おかげで、私はこれがそうなると思う試すことができます編集した部分

/*

を見ていません。私は常にファイルパッケージを調べていましたが、ioに相談したことはありませんでした。ありがとう! – lucafik

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. 

*/

関連する問題