Java Scanner,读取多行时没有这样的元素异常

时间:2018-05-04 03:50:32

标签: java java.util.scanner

我正在尝试使用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);
        }

3 个答案:

答案 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 lineprotocol 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的数组