JAVA - импортировать CSV в ArrayList - PullRequest
6 голосов
/ 10 октября 2011

Я пытаюсь импортировать CSV файл в Arraylist, используя StringTokenizer:

public class Test
{
  public static void main(String [] args)
  {
    List<ImportedXls> datalist = new ArrayList<ImportedXls>();

    try
    {
      FileReader fr = new FileReader("c:\\temp.csv");
      BufferedReader br = new BufferedReader(fr);
      String stringRead = br.readLine();

      while( stringRead != null )
      {
        StringTokenizer st = new StringTokenizer(stringRead, ",");
        String docNumber = st.nextToken( );
        String note = st.nextToken( );  /** PROBLEM */
        String index = st.nextToken( ); /** PROBLEM */

        ImportedXls temp = new ImportedXls(docNumber, note, index);
        datalist.add(temp);

        // read the next line
        stringRead = br.readLine();
      }
      br.close( );
    }
    catch(IOException ioe){...}

    for (ImportedXls item : datalist) {
      System.out.println(item.getDocNumber());
    }
  }
}

Я не понимаю, как работает nextToken, потому что если я сохраню инициализацию трех переменных(docNumber, note и index) как nextToken(), происходит сбой:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(Unknown Source)
    at _test.Test.main(Test.java:32)

Если я сохраню только docNumber, это сработает.Не могли бы вы помочь мне?

Ответы [ 4 ]

18 голосов
/ 10 октября 2011

Кажется, что некоторые строки вашего входного файла имеют менее 3 полей, разделенных запятыми. Вы должны всегда проверять, имеет ли токенизатор больше токенов (StringTokenizer.hasMoreTokens), если только вы не уверены на 100%, что ваш ввод правильный. 1001 *

ПРАВИЛЬНЫЙ парсинг CSV-файлов - задача не такая простая. Почему бы не использовать библиотеку, которая может сделать это очень хорошо - http://opencsv.sourceforge.net/?

2 голосов
/ 10 октября 2011

Вы должны иметь возможность проверять свои токены, используя метод hasMoreTokens ().Если это возвращает false, то возможно, что прочитанная строка не содержит ничего (т. Е. Пустой строки).

Хотя было бы лучше использовать метод String.split () - еслиЯ не ошибаюсь, были планы отказаться от класса StringTokenizer.

2 голосов
/ 10 октября 2011

Скорее всего, ваш входной файл не содержит другого элемента, разделенного , хотя бы в одной строке.Пожалуйста, покажите нам ваш ввод - если возможно, строка, которая не работает.

Однако вам не нужно использовать StringTokenizer.Использование String#split() может быть проще:

...
while( stringRead != null )
{
    String[] elements = stringRead.split(",");

    if(elements.length < 3) {
      throw new RuntimeException("line too short"); //handle missing entries
    }

    String docNumber = elements[0];
    String note = elements[1];
    String index = elements[2];

    ImportedXls temp = new ImportedXls(docNumber, note, index);
    datalist.add(temp);

    // read the next line
    stringRead = br.readLine();
}
...
2 голосов
/ 10 октября 2011

Похоже, ваш код доходит до строки, что токенизатор разбивается только на 1 часть вместо 3. Возможно ли иметь строки с пропущенными данными?Если это так, вам нужно справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...