来自文件的一行的子字符串不适用于Java

时间:2017-12-05 18:45:55

标签: java

在开始之前,我知道这不是从我需要的文件中获取信息的唯一方法,因为我可以使用扫描仪。然而,当我一直试图以这种方式读取它时,子串似乎导致Contract.txt文件中的这一行出现问题:07-Jun-2016 1 3 1 N JB847N 900 S Trotter

哪个使用NormatFormatException“00”,因为它试图解析一个标签。这是唯一能做到这一点的行。

public String averageCostOflarge() {
    int numberOfBundles = 0;
    int total = 0;
    try {
        BufferedReader reader = new BufferedReader(new FileReader("Contract.txt"));

        String line;
        while ((line = reader.readLine()) != null) {
            if (line.charAt(14) == '3') {
                numberOfBundles++;
                if(line.charAt(32)=='\t'){
                    total+=Integer.parseInt(line.substring(28, 32));
                }else{
                    total+=Integer.parseInt(line.substring(28, 31));
                }
            }

        }
        reader.close();
        return Integer.toString(numberOfBundles);
    } catch (FileNotFoundException e) {
        return "Error";
    } catch (IOException ex) {
        Logger.getLogger(ContractSummary.class.getName()).log(Level.SEVERE, null, ex);
        return "Error";
    }
}

然而它似乎主要是这部分:1 3 1 N JB847N 900,因为这部分在文件中多次出现。

合同文件:https://pastebin.com/GFG1Um4g

我删除了导致此问题的所有行,代码运行正常。

代码部分需要检查第三行是否设置为3,然后在第七行中获取成本。这些信息是由制表符而不是空格分隔的,我试图手动输入导致问题的行,看看它是否是文件中的格式错误。

对于我的代码为什么这样做的任何解释都将非常感激。

2 个答案:

答案 0 :(得分:0)

这与标签无关;您的子字符串是“00”或“00 S”,具体取决于S后面的字母是否为制表符。但是parseInt(“00”)因为尾随空格而抛出异常。

如果您要提取“900”,那么您的索引已关闭;第一个索引应该是27而不是28.如果你只想在9之后得到“900”的部分,那么只要求2个字符,子串(28,30)。

然而,取决于确切的字符索引似乎相当脆弱 - 确保日期将是可预测的字符数长,但是以下“1 3 1”每个保证是一个单个数字,永远不会更长?同样,“N”和“JB847N”不会更长/更短? 我的第一个倾向是使用String.split(“\ s”)将你的长行分成有意义的块。

(顺便说一下,你正在寻找第3和第7列“(或”字段“),而不是”行“。)

答案 1 :(得分:0)

您需要添加trim()以删除空格

if (line.charAt(32) == '\t') {
    total += Integer.parseInt(line.substring(28, 32).trim());
} else {
    total += Integer.parseInt(line.substring(28, 31).trim());
}