2012-03-31 3 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

+0

humm нет, я должен использовать файл FILE.txt – ShaunK

+0

?? извините, но ваш ответ о невозможности использования регулярного выражения из-за необходимости использования file.txt не имеет смысла. Вы знакомы с регулярными выражениями и для чего они используются? Если да, пожалуйста, уточните, почему вы не можете их использовать, скажем, 'String # split (...)' –

ответ

1

Возьмите хороший взгляд на данные. Вы получаете больше данных или это единственный файл?

Если вы получаете больше данных, вам нужно иметь какой-то тип spec, поэтому вы можете быть уверены, что ваш синтаксический анализатор продолжит работу.

Если вы зафиксировали расположение данных, то вы можете использовать

String part = line.substring(beginIndex, endIndex) 

Этот файл данных почти с фиксированными положениями, за исключением, когда количество продукта увеличивается ..

Вместо этого, вы можете попробовать regex или line.split (delimitor)

Не используйте regex слишком много, прежде чем вы действительно их поймете.

Если бы это был единственный файл, я думаю, что я хотел бы начать с

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

, а затем разобрать из массива строк, вы получите.

Первая часть, детали [0], будет содержать как номер продукта, так и категорию, но вы также можете разделить это.

+0

Это единственный файл, и данные фиксированы. – ShaunK

1

Так как вы хотите, чтобы разделить текст на основе произвольного шаблона, то есть точно, что RegEx для; используйте парсер RegEx для токенизации ввода, затем обработайте маркеры по желанию.

Проще говоря, вы прочитать файл, передать его RegEx Tokenizer, а затем работать на лексемы (т.е. строк)

Пример шаблон регулярного выражения для ваших данных будет

[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] +

Вы можете быстро и эффективно создать свой узор, используя, например,

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

+0

Да, очень верно. Шахта работает только в том случае, если вход не изменяется или усложняется. Удаленные. 1+ –

+0

В качестве альтернативы вы можете просто поместить строки во входные данные в кавычки, а затем это просто вопрос анализа, подобный scanf, с помощью Scanner или StringTokenizer. – vaxquis