2010-03-04 53 views
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可以是空的(但是它的存在,應在所有情況下識別)
  • 金額的空間可以改變
  • 最後一句話可以改變
+2

你的例子似乎是固定的長度,不是嗎? – PeterMmm 2010-03-04 07:27:49

+0

名稱(字段5)可以更改爲任意長度。 – 2010-03-04 07:29:23

回答

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是可選。然後我的分隔符是:

MF1直至幷包括[AM | PM]

MF2號碼,任何東西,除了BASEMENT- *

MF3 BASEMENT- *

我不是所有的擅長正則表達式,但我會提取那些3組像

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

哪裏?意味着可選組。

-2

您可以使用Strtokenizer從下議院Lang和指定多個分隔符分割上:

有一些內置的類型通過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] 
+0

但我的多個分隔符是什麼?空間的數量可以改變。 – 2010-03-04 07:32:03

+0

空間數量未確定,在某些情況下字段5可能爲空。 – 2010-03-04 07:43:40

+1

是的,這很好,它會按照上面的例子工作(我把你的片段放到一個示例程序中)運行它,它表示很好... – Jon 2010-03-04 07:56:58

2

那麼你可以剝離的時間,並通過列號地下室-FOO數據,因爲它們總是出現在相同的點線。然後你可以根據逗號分割餘數。無論您是需要處理轉義逗號\,還是逗號引號「foo,bar」,都取決於您和您的業務需求。

+1

準確地說,我即將回答。它看起來像一個固定格式的文件給我。 – 2010-03-04 07:34:37

+0

字段「名稱」(字段5)的空間量可能會發生變化。我不能指望列號。 – 2010-03-04 07:35:57

+1

@MAK如果是這樣的話,你的例子會更清晰,如果它顯示的名字太大,它會將BASEMENT-FOO推到右側。因爲你看起來好像BASEMENT-FOO總是在同一列。 – 2010-03-04 07:39:05

1

你可以這樣做:

  • 讀取整個行字符串。
  • 將讀取行分割爲空格(\ s +)。你應該得到5或6件。
  • piece0,piece1和piece2將是 日期,時間和上午/下午。
  • 檢查piece3是否有編號:如果是的話 然後讀取下一塊作爲名稱
  • 最後一塊是地下室的東西。
  • 根據需要將字符串轉換爲 日期,時間,int。
+0

我不知道這將工作時,(場5)是空的..會嗎? – 2010-03-04 07:40:24

+1

@MAK:你必須修改一下。如果你確定最後一部分將有「BASEMENT」作爲前綴,並且你不會有以「BASEMENT」開頭的名字:)那麼如果你發現一個數字是piece3,你可以看到下一部分是否真的是一個名字。 – codaddict 2010-03-04 07:43:40

+0

我希望這會很容易:)沒有保證最後一個字段以一個常量表達式開始。 – 2010-03-04 07:48:43

0

查找每一行,其中的空格字符相鄰的非空者列,然後做這些數字的統計分析:那些發生在每行或幾乎每行是很有可能的領域界限。

與字母相鄰的標點符號類似,但通常不可能猜測a或a是否意味着劃定一個字段。如果它出現在每一行的相同位置,它可能是一個分隔符,但是在諸如D-FL R-TX D-NY這樣的事物列表中,它可能不是。因此,對於任意數據不可能有完全自動的解決方案。

0

由於每個場是非常明顯的(ATLEAST在例如,你上面粘貼)可以做到這一點:

  1. 分割字符串爲標記。
  2. 通過正則表達式模式運行標記化數組的每個元素。
+0

數據可以爲空的字段5如何? – 2010-03-04 07:42:29

相關問題