1

次のようなファイルがあります。

00000;Name blah blah blah;02;13
00032;I don't care;01;44
00123;Hello how are you;02;28
00154;Random text;03;12

私は最初の2つのレコードだけを気にします:

00000 Name blah blah blah
00032 I don't care

等々。そのため、Javaのsplit関数を使用してデータを取得できると思いました。(より良いアイデアを持っている人はいますか?)このようなもの:

String linea = rEntrada.readLine();
String delimitador = "[;]";
String[] tokens = null;
while ((linea = rEntrada.readLine()) != null){
    tokens = linea.split(delimitador);
}

これは最後のレコードのみを保存しているようです。私がする時:

for (String token : tokens){
    logger.info("Token: " + token);
}

私は得る:

Token: 00154
Token: Random text
Token: 03
Token: 12

私は何が間違っているのですか?私が言ったように、私は各行の最初の2つのフィールドだけが必要であり、後でそれらを使用してデータベースへのいくつかの挿入を実行したいと思います。良いデータ構造は何でしょうか?私は素晴らしいコーダーになろうとしていますので、アドバイスをいただければ幸いです。

4

6 に答える 6

1

必要な2つのフィールドのみを使用してホルダークラスを作成し、そのオブジェクトをarraylistに追加します。

例:

Holder
{
int firstAttribute;
String secondAttribute;
//Get/Set methods
}

String[] tokens = null;
List<Holder> list = new ArrayList<Holder>();
while ((linea = rEntrada.readLine()) != null){
    tokens = linea.split(delimitador);
    Holder hObj = new Holder();
    hObj.setFirstAttribute(tokens[0]);
    hObj.secondAttribute(tokens[1]);
    list.add(hObj);
}
于 2012-11-20T16:43:37.350 に答える
1
while ((linea = rEntrada.readLine()) != null){
   tokens = linea.split(delimitador);
}

これにより、ファイルから行が読み取られ、分割され続けます。各反復では、 に 1 行分のトークンが含まtokensれますが、次の反復では、tokens読み取られた新しい行のトークンを指すために参照が使用されます。ループが終了するとtokens、最後に読み取られた行からのデータが残ります。

あなたのどちらか

a) を避けてwhile、行を 2 回読み取りますreadLine(各行の後、トークンを処理して保存します)。

b) ループ内でトークンを処理するため、1 行だけではなく各行を処理します。

私の主張をテストするには、whileループ内にログを追加します。

于 2012-11-20T16:46:25.747 に答える
1

このループでは、各行の結果を配列に追加するのではなく、前の結果を新しい結果に置き換えているため、最後に到達したときに最後の結果のみが存在します!

while ((linea = rEntrada.readLine()) != null){
    tokens = linea.split(delimitador);
}

次のようなことができます。

List<String[]> token = new ArrayList<String[]>();
while ((linea = rEntrada.readLine()) != null){
    tokens.add(linea.split(delimitador));
}

for (String [] token: tokens) {
  System.out.println(token[0] + ":" token[1]);
}

もちろん、サイズによっては、またメモリに問題がある場合は、未使用の追加情報を積極的に削除することをお勧めします。

于 2012-11-20T16:48:04.263 に答える
0
class Record {
    String number;
    String text;

    public Record(String number, String text) {
        super();
        this.number = number;
        this.text = text;
    }   
}

class Parser{

    int maxLines=2;

    public List<Record> parseFile(InputStream in){
        Scanner scanner = new Scanner(in);
        List<Record> list = new ArrayList<Record>();
        String line = null;     
        int curLine=0;
        while(curLine<maxLines && (line=scanner.nextLine())!=null){
            String[] split = line.split(";");               
            list.add(new Record(split[0], split[1]));
            curLine++;
        }
        return list;
    }
}
于 2012-11-20T16:59:00.790 に答える
0

ファイルの行区切りを確認してください。「00123;Hello how are you;02;28」の後にのみある可能性があります。したがって、readLine() の 2 回目の呼び出しは「00154;Random text;03;12」を返します。

それ以外の場合は、ファイルの最後までループしているように見えるため、実際の例を貼り付けます。

于 2012-11-20T16:47:22.657 に答える