我有一个从cvs文件中读取的Java程序,看起来像这样:
1111,John,23
2222,Mary,32
...
我想将每个字段存储在一个数组中。每当我运行以下程序时,我都会收到以下消息:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
我该如何处理该例外?我想这是因为扫描仪读取的数据超出了其限制,但是,while语句是否不能确保它会在其限制内读取?
感谢您的任何帮助
import java.util.*;
import java.io.*;
public class program
{
public static void main(String[] args) throws FileNotFoundException, IOException
{
BufferedReader br = new BufferedReader(new FileReader("info.csv"));
int[] ids = new int[20];
String[] names = new String[20];
int[] age = new int[20];
String line;
int i = 0;
while( (line = br.readLine()) != null)
{
Scanner s = new Scanner(line).useDelimiter(",");
ids[i] = s.nextInt();
names[i] = s.next();
sales[i] = s.nextInt();
s.close();
i++;
}
for(int j = 0; j < 20; j++)
{
System.out.println("Id: "+ids[i]+" Name: "+names[i]+" Age: "+ age[i]);
}
}
}
尝试使用split(,)
String[] split = line.split(",");
if (split.length >= 0) {
String input = split[0];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}
if (split.length >= 1) {
names[i] = split[1];
}
if (split.length >= 2) {
String input = split[2];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}
读取CSV文件实际上非常复杂。处理引号和换行符非常困难。还有一些编码问题要考虑(您没有考虑过;您基本上不应该使用此构造函数FileReader
,因为它使用的是“平台默认编码”)。不要重新发明轮子。使用类似super-csv的内容。
while块可确保您读取每一行一次,并且不会超出文件末尾。每行您强制执行:一个int,一个字符串和一个int,句点。那就是崩溃发生的地方。文件末尾很可能有尾随换行符。一个简单的示例是检查line.trim()
是否为空,如果是,则继续(continue;
),而不尝试读取该行。
但是,实际上,不要动手,获得CSV解析器。
注意:如果您必须重新发明轮子,那么有很多更好,更轻松的方法来从文件中获取所有行。例如,Files.newBufferedReader(Paths.get("/path/to/whatsit"))
甚至Files.lines(Paths.get("/path/to/whatsit"))
,这些方法也方便地默认为UTF-8,即一致的选择,而不是“掷硬币并祈祷”。