2012-03-01 13 views
2

Javaで複数行のテキストを検索するにはどうすればよいですか?

Table name goes here 
                    Page 1 
    This is column one     This is This 
         This is  column is column 
         column two f thre f three f 
               and hal f 

    Row1 in column 1 Row2InCol2  Row3  Row4InCol4 


                    Page 2 


This is column one     This is  This 
         This is  column is column 
         column two f thre f three f 
               and hal f 


Grand Total: -  12    13  25  
私は列を検索したい

私は、私はこのテキストを見つけたときに、このような方法で、「これは列が3 FとHALのfは」テキストファイルに次のヘッダーを持つテーブルを考えてみましょうこの列が開始されたString索引の位置(「This」の索引)およびこの列が終了した索引の位置(「hal f」という語が終了した索引、つまり「f」の索引)を取得できます。すべての列には「This」と「f」という文字が含まれており、上で説明したのと同様の方法で列の開始インデックスと終了インデックスを検索できるはずです。

私は、列ヘッダーと列データのインデックス位置がページ間で一貫していないテキストファイル内のテーブルを解析できるパーサーを実装したいと考えています文字はページの終わりを示します)

私はそのようなアルゴリズムを探していません。 PatternとMatcherのクラス(または他のAPI)が上記のように複数行のテキスト検索をサポートするかどうかを知りたいですか?

+0

本当に表はこのように見えますか? –

+1

私は問題を少し良く定義する必要があると思います。列には複数のデータブロックが含まれているのか、ページごとに1つのブロックのみが分かっていますか? – takteek

+0

@Tichodromaはい。私は各列の幅を特定することにもっと関心があるので、列ヘッダーのみを表示し、表のデータは表示しませんでした。一度列の幅を取得すると、各列ヘッダーの開始インデックスと終了インデックス、つまり列の幅を持たせることで、任意の列のデータを簡単に取得できます。 – CKing

答えて

0

過去に私のために働いたシンプルなパターン。

// split on two ore more spaces. 
String[] fields = line.split("\\s{2,}"); 

これは、1つのスペースをフィールドの一部として扱います。

+0

私はこのアプローチを以前に試みました。この方法は、列の1つが2行にわたる名前を持ち、最初の行ではなく2番目の行から開始すると失敗します( "2列目の列です"を参照)。 – CKing

+0

行をまとめて結合する必要があります。もう1つの問題は、フィールドがすべての行に表示されない場合です。 –

0

あなたが探しているテキストが固定リテラルなので、正規表現は、選択の武器ではありません - ちょうど最初"This"から最後"f"に、改行を含め、テキスト全体にString.indexOf(String)を使用します。

String target = "This\nThis is  column is column\n      column two f thre f three f\n            and hal f"; 

int start = input.indexOf(target); 
int end = start + target.length(); 

String.indexOf(String str, int fromIndex)を前のendとして使用してください。fromIndex

+0

私は、入力文字列に "This is two two f"という文字列を与えないと、\ nを使わずにこの文字列の検索を開始し、列の開始と終了のインデックス(幅)を取得しなければならないという一般的なアプローチが必要です。この文字列と正確に一致します。私があなたのアプローチを使用する場合、私はいつもテキストに現れる可能性のあるすべてのテーブルのすべての列名に対して、改行文字やスペース文字などの位置を知る必要があるように、コードに制限を設けていますファイル。これには、ファイルに追加されるすべての新しいテーブルを解析するための新しいコードを実装する必要があります。 – CKing

+0

パターンとマッチャーを使うとwhileループでfind()メソッドを使うことができます。start()とend()メソッドを自由に使ってインデックス位置を直接取得することもできます。また、Pattern.quoteは、将来問題が生じた場合は、column-nameのメタ文字を無視します。 – CKing

関連する問題