0

次の構文で Line 変数を宣言しました。

行="1;nabil;chouaib;france;27",

Id 、 Firsname 、 lastname 、 address 、 age の5 つの変数を宣言したい

ID には 1 が含まれている必要があります 名には nabil が含まれている必要があります 姓には chouaib が含まれている必要があります 住所には france が含まれている必要があります 年齢には 27 が含まれている必要があります

そのため、変数Lineの内容を解析する必要があります

この場合のセパレータは;

私はこの機能を持っています:

test()->

    ForEachLine = fun(Line,Buffer)-> 
                          io:format("Line: ~s~n",Line),


                          [IdStr, FirstnameStr, LastnameStr, AddressTr, AgeStr] = string:tokens(Line, ";"),
   Buffer end,

 InitialBuffer = [],

 csv:parse("/var/lib/mysql/test/person1.csv",ForEachLine,InitialBuffer).

しかし、テスト関数 T を実行すると、次のエラーが発生します。

1> model:test().
Line: 1;nabil;chouaib;france;27
** exception error: no match of right hand side value [["1;nabil;chouaib;france;27"]]
     in function  model:'-test/0-fun-0-'/2
     in call from csv:start_parsing/3

問題はこの行に関連しています:

[IdStr, Firstname, Lastname, Address, AgeStr] = string:tokens(Line, ";") 

Lineの型は文字列ではないと思います(ただし、エラー前のコンソールではこの行が表示されます Line: 1;nabil;chouaib;france;27

だから私はちょうどラインのタイプを知っている必要があります

csv.erl モジュールは次のとおりです。

%%% --- csv parser in Erlang. ------
%%% To help process large csv files without loading them into
%%% memory. Similar to the xml parsing technique of SAX

-module(csv).
-compile(export_all).

parse(FilePath,ForEachLine,Opaque)->
    case file:open(FilePath,[read]) of
        {_,S} ->
            start_parsing(S,ForEachLine,Opaque);
        Error -> Error
    end.

start_parsing(S,ForEachLine,Opaque)->
    Line = io:get_line(S,''),
    case Line of
        eof -> {ok,Opaque};
        "\n" -> start_parsing(S,ForEachLine,Opaque);
        "\r\n" -> start_parsing(S,ForEachLine,Opaque);
        _ -> 
            NewOpaque = ForEachLine(scanner(clean(clean(Line,10),13)),Opaque),
            start_parsing(S,ForEachLine,NewOpaque)
    end.

scan(InitString,Char,[Head|Buffer]) when Head == Char -> 
    {lists:reverse(InitString),Buffer};
scan(InitString,Char,[Head|Buffer]) when Head =/= Char ->
    scan([Head|InitString],Char,Buffer);
scan(X,_,Buffer) when Buffer == [] -> {done,lists:reverse(X)}.
scanner(Text)-> lists:reverse(traverse_text(Text,[])).

traverse_text(Text,Buff)->
    case scan("",$,,Text) of
        {done,SomeText}-> [SomeText|Buff];
        {Value,Rem}-> traverse_text(Rem,[Value|Buff])
    end.

clean(Text,Char)-> 
    string:strip(string:strip(Text,right,Char),left,Char).
4

1 に答える 1

7

string:tokens/2関数を使用して文字列を文字列のリストに分割し、リストをパターン マッチして変数を抽出できます。

1> [IdStr, Firstname, Lastname, Address, AgeStr] = string:tokens(Line, ";").
["1","nabil","chouaib","france","27"]

そして、list_to_integer/1関数を使用して IdStr と AgeStr を整数に変換できます。

2> Id = list_to_integer(IdStr).
1
3> Age = list_to_integer(AgeStr).
27
于 2013-01-26T20:04:49.547 に答える