Java扫描器,读取多行时没有此类元素异常
我正在尝试使用java scanner从文件中读取多行。每行都有使用逗号分隔的字符串,但在行尾没有逗号。我的文本文件包含如下值 98792203000000509189065012012341234000000167084952103900000015 98792203000000509189065012012341234000000167084952103900000015 扫描器抛出了一个无元素异常,如果我在行尾添加一个逗号,它可以正常工作,但是原始文件将没有逗号。我怎样才能工作Java扫描器,读取多行时没有此类元素异常,java,java.util.scanner,Java,Java.util.scanner,我正在尝试使用java scanner从文件中读取多行。每行都有使用逗号分隔的字符串,但在行尾没有逗号。我的文本文件包含如下值 98792203000000509189065012012341234000000167084952103900000015 98792203000000509189065012012341234000000167084952103900000015 扫描器抛出了一个无元素异常,如果我在行尾添加一个逗号,它可以正常工作,但是原始文件将没有逗号。我怎样才能工作
Scanner sc = new Scanner(outPutFile);
int outputDataStart = Integer.parseInt(outputDataStartLine);
skipLines(sc, outputDataStart);
sc.useDelimiter(",");
while(sc.hasNext())
{
OutputVariables outputVariables = new OutputVariables();
outputVariables.setIccid(sc.next());
outputVariables.setImsi(sc.next());
outputVariables.setKey(sc.next());
outputVariables.setPIN1(sc.next());
outputVariables.setPUK1(sc.next());
outputVariables.setPIN2(sc.next());
outputVariables.setPUK2(sc.next());
outputVariables.setPINAdm(sc.next());
outputVariables.setAccount(sc.next());
outputVariables.setKIC(sc.next());
outputVariables.setKID(sc.next());
outputVariables.setKIK(sc.next());
outputVariables.setOPCKey(sc.next());
OutputVariableList.add(outputVariables);
}
我建议您使用
BufferedReader
它有一个名为readLine()
首先读取一个字符串,然后通过
String.split(“,”)
可以获得字符串数组您要求扫描器从一行文本中解析的值比实际值多。发生这种情况是因为您在调用next()
时没有先选中hasNext()
。因为你已经告诉它使用逗号作为delimeter,所以它会到达行尾,继续到下一行,直到找到下一个逗号
以CSV为例:
A,B,C,D
如果在解析“D”后调用next()
,则扫描仪将抛出NoTouchElementException
Scanner sc = new Scanner(file);
while(sc.hasNext()) {
String line = sc.next();
String[] parts = line.split(",");
if(parts.length != 4) {
System.err.println("Invalid line: " + line);
continue; // skip this record, it is bad
}
// create your object here from parts
Pojo example = new Pojo(parts[0], parts[1], parts[2], parts[3]);
// etc
}
现在还不清楚你想做什么。如果您试图将有效的CSV转换为对象,那么最好使用扫描仪读取每一行,然后调用String.split()
将该行拆分为多个部分
如果您试图将多行解析为一个对象,您当然需要找出边界的位置——每十五个逗号分隔的值?每三行?--并在收集片段时应用该逻辑
作为一个简化的例子,考虑这一行的集合:
A,B,C,D
E,F,G,H
I,J,K
首先使用扫描仪逐行读取,然后使用“将每行分开”创建单个对象。请注意,最后一行的格式不正确——您需要对此设置陷阱并捕获它,以避免出现NoTouchElementException
Scanner sc = new Scanner(file);
while(sc.hasNext()) {
String line = sc.next();
String[] parts = line.split(",");
if(parts.length != 4) {
System.err.println("Invalid line: " + line);
continue; // skip this record, it is bad
}
// create your object here from parts
Pojo example = new Pojo(parts[0], parts[1], parts[2], parts[3]);
// etc
}
如果你只是想创建一个单一的大对象(例如所有的行都属于同一个记录),你可以告诉它除了一个逗号之外,还可以考虑一个新行作为一个分米表。这样,在您点击第一行中的最后一个逗号后,您将调用
next()
,它将一直解析到行尾;然后,当您再次调用next()
时,它将从下一行开始解析,直到到达逗号或行尾,以先到者为准。而不是使用sc.useDelimiter(“,”)
使用sc.useDelimiter(,|\\n”)
它将被这两个中断,
和新行
编辑以添加代码谢谢我使用了缓冲读取器,但我没有使用拆分,而是使用了字符串标记器,它起作用了