JAVA-将CSV导入ArrayList

JAVA-将CSV导入ArrayList,java,csv,import,arraylist,Java,Csv,Import,Arraylist,我正在尝试使用StringTokenizer将CSV文件导入Arraylist: public class Test { public static void main(String [] args) { List<ImportedXls> datalist = new ArrayList<ImportedXls>(); try { FileReader fr = new FileReader("c:\\temp.csv");

我正在尝试使用
StringTokenizer
CSV
文件导入
Arraylist

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());
    }
  }
}

如果我只保留docNumber,它就可以工作。您能帮助我吗?

您的输入文件中有些行的字段少于3个逗号分隔的字段。您应该始终检查标记器是否有更多的标记(StringTokenizer.hasMoreTokens),除非您100%确定您的输入是正确的


正确解析CSV文件并不是那么简单的任务。为什么不使用一个能做得很好的库呢?

似乎您的代码达到了这样一条线,即标记器只分为1个部分,而不是3个部分。是否可能有丢失数据的行?如果是这样,您需要处理这个问题。

很可能您的输入文件在至少一行中没有包含另一个由
分隔的元素。请向我们显示您的输入-如果可能,请显示失败的行

但是,您不需要使用
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();
}
...
。。。
while(stringRead!=null)
{
String[]elements=stringRead.split(“,”);
如果(元素长度<3){
抛出新的RuntimeException(“行太短”);//处理缺少的条目
}
字符串docNumber=元素[0];
字符串注释=元素[1];
字符串索引=元素[2];
ImportedXls temp=新导入的XLS(文件编号、注释、索引);
数据列表。添加(临时);
//读下一行
stringRead=br.readLine();
}
...

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


不过使用String.split()方法会更好——如果我没有弄错的话,有人计划不推荐StringTokenizer类。

为什么不直接使用
stringRead.split(“,”)
?opencsv库使读取csv文件变得非常容易,无需编写自己的代码。谢谢,就是这样!CSV文件不是到处都有三列。。现在我试着使用你们的代码:-)你们也是对的,问题在CSV文件中!谢谢你的openCsv,我也会试试:-)去看看openCsv。想象一下,如果“note”字段包含逗号,您将要使用的代码会发生什么。另一个问题@stackoverflow?:)您的建议最终是最方便的,非常感谢!(别担心,接下来的问题很快就要来了:D
...
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();
}
...