1

各フィールド間に明確な区切り文字 (デリミネータ) がない各行から各フィールドを抽出する最良の方法は何ですか?

フィールドを抽出するために必要な行のサンプルを次に示します。

3/3/2010 11:00:46 AM                      BASEMENT-IN          
3/3/2010 11:04:04 AM 2, YaserAlNaqeb      BASEMENT-OUT         
3/3/2010 11:04:06 AM                      BASEMENT-IN          
3/3/2010 11:04:18 AM                      BASEMENT-IN          
3/3/2010 11:14:32 AM 4, Dhileep              BASEMENT-OUT         
3/3/2010 11:14:34 AM                      BASEMENT-IN          
3/3/2010 11:14:41 AM                      BASEMENT-IN          
3/3/2010 11:15:33 AM 4, Dhileep           BASEMENT-IN          
3/3/2010 11:15:42 AM                      BASEMENT-IN          
3/3/2010 11:15:42 AM                      BASEMENT-IN          
3/3/2010 11:30:22 AM 34, KumarRaju        BASEMENT-IN          
3/3/2010 11:31:28 AM 39, Eldrin           BASEMENT-OUT         
3/3/2010 11:31:31 AM                      BASEMENT-IN          
3/3/2010 11:31:39 AM                      BASEMENT-IN          
3/3/2010 11:32:38 AM 39, Eldrin           BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN          
3/3/2010 11:33:26 AM 34, KumarRaju        BASEMENT-OUT         
3/3/2010 11:33:28 AM                      BASEMENT-IN    

各行には 6 つのフィールドがあり、そのうちのいくつかは空にすることができます。この問題にアプローチする最善の方法は何ですか?

  • Javaを使用しています

エディション 01

  • フィールド 5 は空にすることができます (ただし、その存在はすべての場合に認識される必要があります)。
  • スペースの量は変更できます
  • 最後の言葉は変わる可能性があります
4

6 に答える 6

2

日付と BASEMENT-FOO データを列番号で取り除くことができます。これらは常に行の同じポイントに表示されるからです。次に、コンマに基づいて残りを分割できます。エスケープされたコンマ \ を処理する必要があるか、引用符で囲まれた "foo, bar" のコンマを処理する必要があるかは、あなたとビジネス要件次第です。

于 2010-03-04T07:30:31.053 に答える
1

できるよ:

  • 行全体を文字列として読み取ります。
  • 読み取り行をスペース (\s+) で分割します。5~6枚はいけるはずです。
  • piece0、piece1、piece2 は日付、時刻、AM/PM になります。
  • ピース 3 に番号があるかどうかを確認します。ある場合は、次のピースを名前として読み取ります
  • 最後のピースはその地下室のものです。
  • 必要に応じて、文字列から日付、時刻、整数に変換します。
于 2010-03-04T07:30:47.493 に答える
1

私には3つのメタフィールドがあるようです:

3/3/2010 11:32:38 AM 39, Eldrin           BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN 

MF1:3/3/2010 11:32:38 AM

MF2:39, Eldrin

MF3:BASEMENT-IN

MF2 はオプションです。私の区切り文字は次のようになります。

[AM|PM] までの MF1

MF2番号、BASEMENT-*以外

MF3 地下室-*

私は正規表現が得意ではありませんが、これらの3つのグループを次のように抽出します

(anything)(AM|PM)(number,anything)?(BASEMENT-anything)

どこ ?オプションのグループを意味します。

于 2010-03-04T08:57:56.050 に答える
0

空白文字が非空白文字に隣接している各行の列を見つけて、それらの数について統計分析を行います。すべての行またはほぼすべての行に出現する列は、おそらくフィールド境界です。

文字に隣接する句読点についても同様ですが、一般に、 - または , がフィールドを区切るためのものかどうかを推測することは不可能です。すべての行で同じ位置にある場合は区切り文字である可能性がありますが、D-FL R-TX D-NY などのリストではおそらくそうではありません。したがって、任意のデータに対して完全に自動化されたソリューションはあり得ません。

于 2010-03-04T07:33:49.703 に答える
0

各フィールドは非常に異なるため (少なくとも上に貼り付けた例では)、次のようにできます。

  1. 文字列をトークンに分割します。
  2. トークン化された配列の各要素を正規表現パターンで実行します。
于 2010-03-04T07:34:35.393 に答える
-2

Commons Lang のStrtokenizerを使用して、分割する複数の区切り文字を指定できます。

StrMatcherを介してサポートされる組み込み型が多数あります。

StrTokenizer(char[] input, StrMatcher delim) 

例えば

StrMatcher delims = StrMatcher.charSetMatcher(new char[] {' ', ',', '\n'});
StrTokenizer str = new StrTokenizer(match.toString(), delims);
while (str.hasNext()) {
    System.out.println("Token:[" + str.nextToken() + "]");
}

(上記の例から):

Token:[3/3/2010]
Token:[11:00:46]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:04:04]
Token:[AM]
Token:[2]
Token:[YaserAlNaqeb]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:04:06]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:04:18]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:14:32]
Token:[AM]
Token:[4]
Token:[Dhileep]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:14:34]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:14:41]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:33]
Token:[AM]
Token:[4]
Token:[Dhileep]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:42]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:42]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:30:22]
Token:[AM]
Token:[34]
Token:[KumarRaju]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:31:28]
Token:[AM]
Token:[39]
Token:[Eldrin]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:31:31]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:31:39]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:38]
Token:[AM]
Token:[39]
Token:[Eldrin]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:47]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:47]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:33:26]
Token:[AM]
Token:[34]
Token:[KumarRaju]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:33:28]
Token:[AM]
Token:[BASEMENT-IN]
于 2010-03-04T07:29:00.883 に答える