2012-03-31 44 views
0

我現在有一個具有以下內容的文本文件:如何在讀/寫中分割tex文件中的一行?

1 Commercial & Enterprise 5 SLICE 59.99 IP MICRO 
2 Commercial & Enterprise 5 SLICE 59.99 MULTI-USE SWITCH 
. 
. 
. 
. 
18 Government & Military 6 TCP  15.00 TCP 

我試圖拆行,這樣我可以有以下幾種:

Product number: 18 
Category:  Government & Military 
Product name: TCP 
Units in stock: 6 
Price: $15.00 
Total value: $90.00 
Fee: $4.50 
Total value: $94.50 

目前,我有以下代碼:

while ((line = lineReader.readLine()) != null) { 

      StringTokenizer tokens = new StringTokenizer(line, "\t"); 

      p = new ActionProduct(); 
      add(p); 
      String category = p.getCategory(); 
      String name = p.getName(); 
      category = tokens.nextToken(); 
      int item = p.getItem(); 
      double price = p.getPrice(); 
      int units = p.getUnits(); 

      while (tokens.hasMoreTokens()) { 
      item = Integer.parseInt(tokens.nextToken()); 
      price = Double.parseDouble(tokens.nextToken()); 
      units = Integer.parseInt(tokens.nextToken()); 
      } 

      System.out.println("Category: " + category); 
      System.out.println("Product number: " + item); 
      System.out.println("Product name: " + name); 
      System.out.println("Units in stock: "+ units); 
      System.out.println("Price: $" + String.format("%.2f", price)); 
      System.out.println("Total value: $" + String.format("%.2f",p.value())); 
      System.out.println("Fee: $" + String.format("%.2f", p.fee())); 

      System.out.println("Total value: $" + String.format("%.2f", value())); 
     } 

而且我得到這個輸出,而不是:

Category: 1 Commercial & Enterprise 5 SLICE 59.99 IP MICRO    
Product number: 0 
Product name: null 
Units in stock: 0 
Price: $0.00 
Total value: $0.00 
Fee: $0.00 
Total value: $0.00 
Category: 2 Commercial & Enterprise 5 SLICE 59.99 MULTI-USE SWITCH  
Product number: 0 
Product name: null 
Units in stock: 0 
Price: $0.00 
Total value: $0.00 
Fee: $0.00 
Total value: $0.00 

所以我的問題是......我必須做些什麼來分割線條,以便我可以單獨打印每個紡織品的價值?在此先感謝大家,真的會很欣賞一些方向!

這裏是我的文本文件:

1 Commercial & Enterprise 5 SLICE 59.99 IP MICRO    
2 Commercial & Enterprise 5 SLICE 59.99 MULTI-USE SWITCH  
3 Commercial & Enterprise 4 SLICE 59.99 2100     
4 Commercial & Enterprise 6 SLICE 59.99 IP     
5 Commercial & Enterprise 4 HDX  45.00 HYBRID CARRIER  
6 Commercial & Enterprise 10 TRANSip 45.00 IP Technology Suite 
7 Commercial & Enterprise 5 GUI  30.00 LINK COMMAND SYS  
8 Commercial & Enterprise 5 GUI  30.00 MAUI     
9 Commercial & Enterprise 6 RCP  20.00 RCP     
10 Government & Military 5 SLICE 60.00 IP MICRO    
11 Government & Military 5 SLICE 60.00 MULTI-USE SWITCH  
12 Government & Military 4 SLICE 60.00 2100     
13 Government & Military 6 SLICE 55.00 IP     
14 Government & Military 4 HDX.C 35.00 HYBRID CARRIER  
15 Government & Military 10 TRANSip 30.00 IP Technology Suite 
16 Government & Military 5 GUI  20.00 LINK COMMAND SYS  
17 Government & Military 5 GUI  20.00 MAUI     
18 Government & Military 6 TCP  15.00 TCP 
+0

RegEx是一個選項嗎? – David 2012-03-31 19:33:59

+0

humm不,我必須使用FILE.txt – ShaunK 2012-03-31 19:41:23

+0

??對不起,但你的回覆關於不能使用正則表達式由於不得不使用file.txt是沒有意義的。您是否熟悉正則表達式以及它們的用途?如果是這樣,請詳細說明爲什麼你不能在'String#split(...)' – 2012-03-31 19:45:55

回答

1

採取在數據很好看。你獲得更多的數據,還是這是唯一的文件?

如果您獲得了更多數據,那麼您需要具備某種規格,因此您可以確定,解析器將繼續工作。

如果你有固定的數據的位置,那麼你可以使用

String part = line.substring(beginIndex, endIndex) 

該數據文件幾乎與固定位置時,除產品數量增加..

相反,你可以試試正則表達式或line.split(分隔符)

在真正理解它們之前,不要過多使用正則表達式。

如果這是唯一的文件,我想我會開始一個

String[] parts = line.split(" ") //two spaces 

,然後從字符串數組你解析。

第一部分零件[0]將包含產品編號和類別,但您也可以將其拆分。

+0

這是唯一的文件,並且數據是固定的。 – ShaunK 2012-03-31 20:40:29

1

既然你想基於任意圖案文字拆分,即正是什麼正則表達式是;使用RegEx解析器標記輸入,然後根據需要處理令牌。

簡單地說,你讀的文件,把它傳遞給正則表達式標記生成器,然後在令牌工作(即字符串)

爲您的數據的一個例子正則表達式模式將

[0-9] + [\ s] + [a-zA-Z \ s \ Q & \ E] + [\ s] + [0-9] + [\ s] + [a-zA-Z] + [\ s] + [ 0-9 \ Q. \ E] + [\ s] + [a-zA-Z0-9] +

您可以通過使用eg快速有效地創建模式

http://gskinner.com/RegExr/

進一步閱讀:

http://en.wikipedia.org/wiki/Regular_expression

http://docs.oracle.com/javase/tutorial/essential/regex/

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

+0

Hovercraft的解決方案只有在 a)輸入中的每個空格是一個**空格** - 簡單使用製表符會將所有東西擰緊,b)每個字段用空格填充到固定寬度 - 任何如果不遵守規定將會導致錯誤, 所以這可能是**不是** OP所要求的。 – vaxquis 2012-03-31 20:14:37

+0

是的,非常真實。如果輸入沒有變化或變得更復雜,我的工作纔有效。刪除。 1 + – 2012-03-31 20:15:09

+0

或者,您可以將輸入中的字符串放入引號中,然後使用Scanner或StringTokenizer進行類似scanf的解析。 – vaxquis 2012-03-31 20:21:12

相關問題