在开始之前,我知道这不是从我需要的文件中获取信息的唯一方法,因为我可以使用扫描仪。然而,当我一直试图以这种方式读取它时,子串似乎导致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,然后在第七行中获取成本。这些信息是由制表符而不是空格分隔的,我试图手动输入导致问题的行,看看它是否是文件中的格式错误。
对于我的代码为什么这样做的任何解释都将非常感激。
答案 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());
}