0

やあ、

私はファイルを1行ずつ読み取る際に論理的な問題を経験しています。でこれを実行できることは知っていますがBufferedReader、より多くの行に記述された「値」がある場合があります。これは重要です。

読んでいるファイルのサンプル:

   <#FIELD NAME = DESC> Some text that goes

        over multiple lines

        which is needed</#FIELD>

    <#FIELD NAME = TEMP> some values are just a single line</#FIELD>

上記のようにTEMPまたはDESCであるフィールド名を解析してから、これらの括弧の間の値を抽出する必要があります<#FIELD NAME =DESC>important values </#FIELD>。しかし、BufferedReaderを使用するときに、エントリに複数行の値または単一の値の行があることを「認識」して、それを変数に保存する方法がよくわかりません。

私を正しい方向に導くためのヒントや例を本当にいただければ幸いです。

行ごとに読んだので、進歩するのに役立ちませんでした...もっと簡単に読む方法があると思うので、コード全体を投稿しません。これにより、これまでに何をしたかがわかります。小さなスニペット。

if (line.contains("<#FIELD NAME = AUTOR>"))
{
    String autor = line.substring(line.indexOf(">") + 1, line.indexOf("</#"));
    metaData.setAutor(autor.trim());
}
else if (line.contains("<#FIELD NAME = DOKUMENTNR>"))
{
    String dokumentnr = line.substring(line.indexOf(">") + 1, line.indexOf("</#"));
    metaData.setDoukumentnr(dokumentnr.trim());
    ...
4

5 に答える 5

1
while((line=reader.readLine()) != null){
    if(isDescOrTemp(line)){
        if(line.endsWith("</#FIELD>"){
           //one line field
        } else
        while(!line.endsWith("</#FIELD>"){
            //read more lines
            line=reader.readLine();
            //store line somewhere
        }
    }
}
于 2012-11-21T10:12:45.960 に答える
1

私の理解では、階層データ (ツリーなど) がない場合は、リストがあることを意味するので、それを分割する方法を探しています。通常はクリーンなパーサーを作成する必要がありますが、そうでない場合は、独自の方法でハックしてみてください。

String s = "<#FIELD NAME = DESC> Some text that goes\nover multiple lines\nwhich is needed</#FIELD>\n<#FIELD NAME = TEMP> some values are just a single line</#FIELD>";
String[] fs = s.split("<#FIELD NAME = ");
for (String f : fs) {
    System.out.println(f);
}

生産する

DESC> Some text that goes
over multiple lines
which is needed</#FIELD>

TEMP> some values are just a single line</#FIELD>

</#FIELD>この後、末尾の を削除し、先頭のキーを読み取って、結果文字列をクリーンアップする必要があります。

于 2012-11-21T10:19:47.263 に答える
1

のようなものを試してください

public string ReadField(BufferedReader reader) 
{
    string line = reader.readLine();
    while (line.indexOf("</#FIELD>") == -1)
    {
        line += reader.readLine(); // This does not preserve line breaks
    }

    return line;
}

元のコードでは、次のようなものです

string line = ReadField(myReader); // This reads up to the next field

if(line.contains("<#FIELD NAME = AUTOR>")){
   String autor = line.substring(line.indexOf(">")+1,line.indexOf("</#"));
   metaData.setAutor(autor.trim());
} else if(line.contains("<#FIELD NAME = DOKUMENTNR>")) {
   String dokumentnr = line.substring(line.indexOf(">")+1,line.indexOf("</#"));
   metaData.setDoukumentnr(dokumentnr.trim());
}
于 2012-11-21T10:21:20.677 に答える
0

以下のような疑似コードに従うことができます。

While(!EOF)
{
    string line = readLine();
    while( !EOF && ! line.contains("</#FIELD>"))
    {
        line += readLine();
    }
    // Here you get a line with matching `begin` and `end`

    // ... do operations as needed

    // reset line
    line = "";
}
于 2012-11-21T10:18:45.033 に答える
0

私のバージョン:

    Pattern p = Pattern.compile("<#FIELD.+</#FIELD>", Pattern.DOTALL);
    Scanner s = new Scanner(new File("test.txt"));
    for(;;) {
        String field = s.findWithinHorizon(p, 0);
        if (field == null) {
            break;
        }
        // here you got a full #FIELD element, parse it
        System.out.println(field);
    }
于 2012-11-21T10:26:13.433 に答える