2016-03-24 8 views
2

私はファイルから内容を読み込み、それをタプルのリストに整理しようとしています。私は数字のリストにファイルを読み込んだが、改行直後の数字をスキップしているように見えるが、この動作を防ぐには? 偶数文字のファイルが保証されています。ここでErlangのリストからタプルのリストを構築する

-module(brcp). 
-export([parse_file/1]). 

parse_file(Filename) -> 
    read_file(Filename). 

read_file(Filename) -> 
    {ok, File} = file:read_file(Filename), 
    Content = unicode:characters_to_list(File), 
    build_tuples([begin {Int,_}=string:to_integer(Token), Int end|| Token<-string:tokens(Content," /n/r")]). 

build_tuples(List) -> 
    case List of 
     [] -> []; 
     [E1,E2|Rest] -> [{E1,E2}] ++ build_tuples(Rest) 
    end.  

サンプル入力ファイルされる:

1 7 11 0 
1 3 5 0 7 0 
1 8 10 0 1 11 
99 0 
+0

私は「リスト内包」はここから始めるのがよいと思いますが、最初にリストを1つだけ作成してタプルのリストが必要です。その間に、私は強くそれが "タプル"であり、 "touple"ではないと強く信じています –

+0

ありがとう:)私は数字だけを読み込んでロードしましたが、改行に遭遇した場合、数字をスキップします。 – Scy

+0

例を追加できますか?入力データの?私は、http://erlang.org/doc/man/binary.html#split-2を使用するとここでより効率的になると確信していますが、あなたが実際に何を読んでいるのかわからなくても解決策を提案することはできません。 – Amiramix

答えて

1
-module(tuples). 
-export([parse/0]). 

parse() -> 
    {ok, File} = file:read_file("tuples.txt"), 
    List = binary:split(File, [<<" ">>, <<"\t">>, <<"\n">>], [global, trim_all]), 
    io:format("~p~n", [List]), 
    build_tuples(List, []). 

build_tuples([X,Y|T], Acc) -> 
    build_tuples(T, [{X,Y}|Acc]); 
build_tuples([X|T], Acc) -> 
    build_tuples(T, [{X, undefined}|Acc]); 
build_tuples([], Acc) -> 
    lists:reverse(Acc). 

私が使用したテキストファイルは、ほとんどあなたのようですが、私はそれがより現実的にするために、タブや複数のスペースを追加しました:

1 7 11 0 
1 3 5 0 7 0 
    1 8 10 0 1 11 
99 0 

​​でタプルに追加するときにバイナリを整数に変換することはもちろん可能です。コード内で使用されるbinary:split/3関数は、すべての空の文字(タブ、スペース、改行)を空のバイナリに解析し、次にtrim_allが無視します。あなたの入力が常に正しい場合は、それらをスキップすることができます。結果:

14> tuples:parse(). 
[<<"1">>,<<"7">>,<<"11">>,<<"0">>,<<"1">>,<<"3">>,<<"5">>,<<"0">>,<<"7">>,<<"0">>,<<"1">>,<<"8">>,<<"10">>,<<"0">>,<<"1">>,<<"11">>,<<"99">>,<<"0">>] 
[{<<"1">>,<<"7">>},{<<"11">>,<<"0">>},{<<"1">>,<<"3">>},{<<"5">>,<<"0">>},{<<"7">>,<<"0">>},{<<"1">>,<<"8">>},{<<"10">>,<<"0">>},{<<"1">>,<<"11">>},{<<"99">>,<<"0">>}] 
+1

Hahahahha、私が使用していたトークン区切り文字は、バックスラッシュの代わりにスラッシュを使用していました。 – Scy

関連する問題