Как разделить строку в текстовом файле в режиме чтения / записи? - PullRequest
0 голосов
/ 31 марта 2012

В настоящее время у меня есть текстовый файл, который имеет следующее:

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  

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

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

Если вы получаете больше данных, вам нужно иметь какие-то спецификации, чтобы вы могли быть уверены, что ваш парсер продолжит работу.

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

String part = line.substring(beginIndex, endIndex)

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

Вместо этого вы можете попробовать с помощью регулярных выражений или line.split (разделитель)

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

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

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

и затем анализируйте полученный массив строк.

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

1 голос
/ 01 апреля 2012

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

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

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

[0-9] + [\ s] + [A-Za-Z \ S \ Q & \ Е] + [\ 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

...