0

フォーマットが少し複雑なファイルを解析して検証する必要があります。

基本的に、ファイルは次の形式で提供されます。

   \n -- just to make clear it may have empty lines
   CLIENT_ID
   A_NUMERIC_VALUE
   ONE_LINE_OF_SOME_RANDOM_COMMENT_ABOUT_THE_CLIENT
   ANOTHER_LINE_OF_SOME_RADOM_COMMENT_ABOUT_THE_CLIENT
   \n
   \n
   CLIENT_ID_2
   A_NUMERIC_VALUE_2
   ONE_LINE_OF_SOME_RANDOM_COMMENT_ABOUT_THE_CLIENT_2
   ANOTHER_LINE_OF_SOME_RADOM_COMMENT_ABOUT_THE_CLIENT_2
   OHH_THIS_ONE_HAS_THREE_LINES_OF_COMMENTS

ファイルが大きくなることはめったにありません (10 MB はおそらく私が今まで見た中で最大のファイルです。通常は約 900kb-1mb です)。

だから私は2つの問題があります:

1) ファイルの形式を効果的に検証するにはどうすればよいですか? 正規表現 + スキャナーを使用していますか? (各クライアント エントリを 1 つの文字列に変換できる場合、これは非常に実現可能なオプションだと思います。そのため、正規表現を適用できます)。

2) ファイル内の各エントリを Client オブジェクトに変換する必要があります。ファイルを Java オブジェクトに変換する前に、ファイル全体を検証する必要がありますか? それとも、エントリを Java オブジェクトに変換する際にファイルを検証する必要がありますか? (いずれかのクライアント エントリが無効な場合、処理はすぐに停止し、例外がスローされることに注意してください。したがって、作成されたオブジェクトはすべて破棄されます)。

質問 1 についてのご提案をお待ちしております。質問 2 は、この状況をどのように処理するかについての私の好奇心です。#2 は無視してください。ただし、#1 に答えてください =)

ところで、ファイルの処理に役立つフレームワークを知っている人はいますか?

ありがとう。

アップデート:

この質問を見ましたが、問題は私のものと非常に似ていますが、正規表現がこの問題を解決する最善の方法であるかどうかはわかりません。ファイル全体に非常に多くの "\n" があり、各クライアント エントリとオプションの ID ごとにさまざまな数のコメントが含まれている可能性があります。したがって、正規表現は非常に複雑になる必要があります。そのため、質問#1で各エントリを1行に変換することについて言及しました。この方法は、検証する正規表現を作成するのがはるかに簡単だからです...にもかかわらず、このソリューションは私の耳にはあまりエレガントに聞こえません:(

乾杯。

4

1 に答える 1

0

無効な部分が見つかった場合にバッチを失敗させる場合は、最初にファイルを検証します。

いくつかの利点があります。1 つは、検証と処理が同期している必要がないことです。たとえば、バッチを毎日処理し、ファイルを 1 日中受信する場合は、1 日を通してバッチを検証し、スケジュールされた処理の前に問題を修正するように通知できます。もう 1 つの理由は、ファイルが整形式かどうかの検証が非常に高速であることです。

短くて単純な perl スクリプトで十分です。パターンを正しく理解していれば、データを変換する必要はなく、すべて先読みです。

read past any newlines
read and validate a client id
read and validate a numeric value
read and validate one or more comments until a blank line is found
repeat the above four steps until EOF or invalid data detected
于 2013-04-15T04:57:54.733 に答える