0

区切りファイルに変換する必要があるテキスト ファイル ダンプがあります。このファイルには、次のようにフォーマットされた一連の「レコード」(適切な言葉がないため) が含まれています。

User: abc123 
Date: 7/3/12
Subject: the foo is bar
Project: 123456
Problem: foo bar in multiple lines of text
Resolution: foo un-barred in multiple lines of text

User: abc123 
Date: 7/3/12
Subject: the foo is bar
Project: 234567
Problem: foo bar in multiple lines of text
          which may include <newline> and 
          extend to multiple lines of text
Resolution: foo un-barred in multiple lines of text

...

現在、Java では、StringBuffer を使用してこのファイルを 1 行ずつ読み取り、一連のif(inputLine.toLowerCase().startsWith("user:"))ロジックに基づいて行を個々のフィールドに解析し、最終的な区切り行をテキスト ファイルに出力しています。

ただし、フィールドProblemとフィールドResolutionは自由形式で、複数行にすることもできます。2 つの文字列Problem:を作成するようなことをしようとしています。Resolution:Resolution:Form:

私はすでにこのリンクこのリンクを見てきましたが、これはこれを行う適切な方法である可能性があることを示唆してStringBuilderいます...しかし、ロジックを構築する方法がよくわかりません。

編集: 私は行ごとに読んでいるので、コーディング方法に頭を悩ませています

<pseudocode>
If the line starts with "Problem" extract the charactes after "Problem" else
if the PRIOR line starts with "problem" and the current line doesnt start with "resolution" then append characters in line to prior line
etc.
</pseudocode>

しかし、「問題...?」という 3 行目があれば、それを機能させる方法を視覚化することはできません。

希望する結果を達成するためのアイデアや代替方法はありますか?

4

3 に答える 3

2

こんにちは、私があなたの問題を正しく理解していれば、これらの行に沿った何かがうまくいくはずです:

    StringBuilder problemDesc = new String....;
    if(inputLine.toLowerCase().startsWith("problem:")){
       problemDesc.append(inputLine);
       while(!inputLine.toLowerCase().startsWith("resolution:"){
           //read next line into inputline;
           problemDesc.append(inputline);
       }
       //deal with problem description here and inputLine now has the line with
       //Resolution in it Repeat same logic for retrieving the resolution value
    }
于 2012-07-03T13:15:41.823 に答える
2
StringBuilder problem;
StringBuilder resolution;

//...

// If the current line starts with "Problem: "
if(inputLine.toLowerCase().startsWith("Problem: ")) {
   // Continue appending to the string builder until the delimiting line is reached
   while(!inputLine.toLowerCase().startsWith("Resolution") {
      problem.append(inputLine);
   }
}

// Something similar for resolution
于 2012-07-03T13:17:13.903 に答える
1

ここでは少し大胆に、JavaCCなどの実際のパーサー ジェネレーターの使用を提案します。

質問の中で、自由形式のフィールドは 2 つしかないとおっしゃいましたが、将来的に自由形式として追加される他のフィールドがあるかもしれません。2 つのフィールドを異なる方法でハードコーディングすると、3 番目、4 番目、または n 番目の特殊なケースが追加されたときに多くの副作用が生じる可能性があります。

JavaCC は、実行時に追加の jar を必要とせずに実際のパーサーを生成します。さらに良いことに、将来の特別なケースが問題を引き起こさないように、解析ルールについて考えることができます。

于 2012-07-03T13:20:53.557 に答える