我正在尝试使用java扫描程序从文件中读取多行。每行都有使用逗号分隔的字符串,但行末没有逗号。我的文本文件包含如下所示的值
98792203000000005091,89065012012341234100000000000167,084952103900000015 98792203000000005091,89065012012341234100000000000167,084952103900000015
扫描程序抛出无元素异常,如果我在行末添加逗号,它可以正常工作,但原始文件没有逗号。我该如何工作
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);
}
答案 0 :(得分:0)
您要求扫描程序从一行文本中解析比值更多的值。之所以发生这种情况,是因为您未先检查next()
即可致电hasNext()
。由于您已经告诉它使用逗号作为分隔符,因此它会在行的末尾继续到下一行,直到它找到下一个逗号。
考虑这个CSV:
A,B,C,D
如果在解析" D"后调用next()
,扫描程序将抛出NoSuchElementException。
目前尚不清楚你正在尝试做什么。如果您尝试将有效的CSV转换为对象,那么最好的办法是使用扫描程序读取每一行,然后String.split()
调用将该行拆分为多个部分。< / p>
如果你试图将多个行解析为一个对象,你当然需要弄清楚你的边界在哪里 - 每十五个逗号分隔值?每三行? - 并在收集细分时应用该逻辑。
作为简化示例,请考虑以下行集:
A,B,C,D
E,F,G,H
I,J,K
您首先使用扫描仪逐行读取,然后使用拆分每一行并创建单个对象。注意最后一行是格式错误的 - 您需要为此捕获并捕获它以避免NoSuchElementException。
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()
时,它将从 next 行开始解析,直到它到达逗号或行尾,以先到者为准。
答案 1 :(得分:0)
使用sc.useDelimiter(",")
sc.useDelimiter(",|\\n")
使用,
,new line
和protocol SliderDelegate: class {
func sliderValueChanged(withValue: Int, cell: TableViewCell)
}
class TableViewCell: UITableViewCell {
weak var delegate: SliderDelegate?
@IBAction func sliderBtnClick(_ sender: UISlider) {
img.alpha = CGFloat(slider.value)
delegate?.sliderValueChanged(withValue: slider.value, cell: self)
}
}
答案 2 :(得分:-2)
我建议您使用BufferedReader
它有一个名为readLine()
的方法
首先读取一个String然后通过string.split(",")
你可以得到String的数组