JAVA - 将CSV导入ArrayList

时间:2011-10-10 12:10:25

标签: java csv import arraylist

我正在尝试使用CSVArraylist文件导入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的工作原理,因为如果我将三个变量(docNumbernoteindex)初始化为nextToken() ,它失败了:

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

如果我只保留docNumber,它就有效。你能帮帮我吗?

4 个答案:

答案 0 :(得分:18)

输入文件的某些行似乎有少于3个以逗号分隔的字段。您应该始终检查tokenizer是否有更多令牌(StringTokenizer.hasMoreTokens),除非您100%确定您的输入是正确的。< / p>

CORRECT解析CSV文件并非如此简单。为什么不使用能够做得很好的图书馆 - http://opencsv.sourceforge.net/

答案 1 :(得分:2)

好像你的代码已经到了一条线,Tokenizer只分成1部分而不是3部分。是否可能有缺少数据的行?如果是这样,你需要处理这个问题。

答案 2 :(得分:2)

很可能您的输入文件中不包含由,在至少一行中分隔的其他元素。请告诉我们您的输入 - 如果可能,请输入失败的行。

但是,您不需要使用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();
}
...

答案 3 :(得分:2)

您应该能够使用hasMoreTokens()方法检查您的令牌。如果返回false,则您读取的行可能不包含任何内容(即空字符串)。

虽然使用String.split()方法会更好 - 如果我没弄错的话,有计划弃用StringTokenizer类。