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