JAVA – 将CSV导入ArrayList
我正在使用StringTokenizer
尝试将导入CSV
文件导入Arraylist
:
public class Test { public static void main(String [] args) { List datalist = new ArrayList(); 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,它就可以了。 你可以帮帮我吗?
您的输入文件的某些行似乎有少于3个逗号分隔的字段。您应该始终检查tokenizer是否有更多的令牌(StringTokenizer.hasMoreTokens),除非您100%确定您的输入是正确的。
CORRECT解析CSV文件并非如此简单。 为什么不使用能够做得很好的库 – http://opencsv.sourceforge.net/ ?
看起来你的代码正在变成一条线,Tokenizer只分成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(); } ...
您应该能够使用hasMoreTokens()方法检查您的令牌。 如果返回false,则您读取的行可能不包含任何内容(即空字符串)。
尽管使用String.split()方法会更好 – 如果我没有弄错,有计划弃用StringTokenizer类。
- 在JavaFX中使用ObservableList是否违反模型 – 视图 – 控制器分离?
- HashSet与ArrayList包含性能
- 如何在generics中将一个整数元素添加到通配符的ArrayList中?
- 将Dynamic ArrayList与ArrayList进行比较! 并删除动态数组中不存在的元素
- Firebase / Android:将检索到的值从Firebase添加到arraylist会返回空指针exception
- Java程序不会向ArrayList添加对象
- ArrayList的不安全或未检查的操作
- 将包装器的Array ArrayList转换为相应的基元数组
- 在单独的行中显示每个列表元素(控制台)