2013-10-28 4 views
0

ивы получили эту спецификацию файл CSV:Синтаксические один CSV строки

  • Key - Структурированный в категории: ID, где ID это порядковый номер. Там нет необходимости (или использовать), чтобы разделить это на двух частей, просто обработайте ключ как единое уникальное значение
  • Бренд - Производитель продукта
  • модели - Название модели продукта
  • WeightInKg - Вес продукта, округлены до ближайшего кг
  • Цена - Цена продажи продукта до 2 знаков после запятой (2DP)

и я получил этот код, чтобы разметить каждую строку:

public WarehouseItem(String warehouseItem) { 
    String key, brand, model; 
    int weightInKG; 
    double price; 
    StringTokenizer strTok; 

    strTok = new StringTokenizer(warehouseItem); 
    try { 
    key = strTok.nextToken(); 
    brand = strTok.nextToken(); 
    model = strTok.nextToken(); 
    weightInKG = Integer.parseInt(strTok.nextToken()); 
    price = Double.valueOf(strTok.nextToken()); 
    } 
    catch (Exception e) { 
    throw new IllegalStateException("CSV row had invalid format"); 
    } 
} 

Когда я пытаюсь запустить его, я получаю IllegalStateException для файла CSV.

Exception in thread "main" java.lang.IllegalStateException: CSV row had invalid format 
    at WarehouseItem.<init>(WarehouseItem.java:23) // throwing exception 
    at main.loadRecords(main.java:63) // records[numRows] = new WarehouseItem(warehouseItem); storing into array of objects 
    at main.main(main.java:26) // loadRecords(); calling the function which reads a line 
    at main.loadRecords(main.java:78) // main(null); recursing back to main 
    at main.main(main.java:26) // loadRecords(); calling the function which reads a line 

Heres пример строки в файле CSV:

Couch: 6, Fremarc, Делюкс, 101,1871.7

им думать, может быть, его, потому что ключ имеет идентификатор как порядковый номер? ? или это вообще не имеет значения? im confused и любая помощь будет оценена

+1

Можете ли вы опубликовать точную ошибку вы получаете? EDIT: Нет ... вы не можете. Вы можете вытащить его из блока 'try catch', запустить его, а затем сообщить нам, какую ошибку вы получаете? – nhgrif

+0

Я получаю исключение NoSuchElementException, когда я удалил его на блок try-catch –

+0

Что такое строка 23? Строка 26? Линия 63? Строка 78? – nhgrif

ответ

2

StringTokenizer немного тяжело для того, что вы пытаетесь сделать (и в то же время не достаточно сложным, если вы хотите разобрать точный формат CSV с двойными кавычками).

Более легкий подход будет использовать String.split метод, например:

public WarehouseItem(String warehouseItem) { 
    String key, brand, model; 
    int weightInKG; 
    double price; 
    String[] tok = warehouseItem.split(","); 
    if (tok.length != 5) { 
     throw new IllegalStateException("Invalid CSV: not enough columns"); 
    } 
    key = tok[0]; 
    brand = tok[1]; 
    model = tok[2]; 
    weightInKG = Integer.parseInt(tok[3]); 
    price = Double.valueOf(tok[4]); 
    // Do something with the values you've got 
    ... 
} 
+0

Это, безусловно, подход, который я бы взял. На каждом языке, где я работаю с CSV, я всегда ищу что-то вроде '' String.split''. – nhgrif

+0

Я просто использовал ваш способ делать что-то, и это сработало! ive успешно сохранил строки csv в массиве объектов. спасибо –

+0

Эй, когда я пытаюсь распечатать его с помощью System.out.println (записи [numRows]) (записи WarehouseItem [] и numRows - это просто счетчик, который инициализируется 0 и увеличивается на 1 после прочтения каждой строки), я получаю строка WarehouseItem @ b4e29b –

4

Вы, вероятно, лучше от с библиотекой. CSV может быть удивительно сложно разобрать. Посмотрите OpenCSV:

http://opencsv.sourceforge.net/

CSVParser parser = new CSVParser(); 
String[] fields = parser.parseLine(line); 
+0

Это лучше, чем String.split(), особенно в тех случаях, когда один столбец в CSV имеет строку типа и может содержать пробелы или запятые. –

Смежные вопросы