[英]parsing numbers from a text file
只是想知道我在这里做错了什么。 我试图从文件中读取并解析一些数据。 我不断收到错误“ java.lang.NumberFormatException”,它无法解析数字。 我知道我使用getNextDouble()或get nextInt(),但我试图保持代码尽可能的通用。 任何想法将不胜感激。 TY。
这是我的文本文件中一行的示例:
foo Bar 19.35 55 987.0054 4
public void readFile(){
int i=0;
String line;
try{
fileIn = new Scanner(new File("pa1Names.txt"));
}catch(Exception e){
System.out.println("Fatal Error: File was not opened");
}
while(i<names.length && fileIn.hasNext()){
line = fileIn.nextLine();
StringTokenizer st = new StringTokenizer(line);
int m = st.countTokens();
names[i] = st.nextToken();
for (int k = 0; k<m-5; k++)
{
names[i] = names[i] + " " + st.nextToken();
}
reals[i][0] = Double.parseDouble(st.nextToken());
ints[i][0] = Integer.parseInt(st.nextToken());
reals[i][1] = Double.parseDouble(st.nextToken());
ints[i][1] = Integer.parseInt(st.nextToken());
i++;
}//end while
fileIn.close();
}
如果我很好理解,在您的示例中
foo Bar
您读取st.nextToken而不是两次读取了三遍。 可能您需要使用以下内容:
names[i] = "";
for (int k = 0; k<m-4; k++)
{
names[i] = names[i] + " " + st.nextToken();
}
删除names[i] = st.nextToken();
从您的代码应该可以正常工作。
问题是您甚至在进入for
循环之前就正在读取第一个令牌for
在try / catch块中,您需要在catch块中放入return语句,或者将其余代码移到try块中(如果文件打开失败,即使您捕获了错误, fileIn.HasNext肯定会失败,因为该文件仍未打开)。
我还复制并粘贴了您的代码并通过调试器运行它,我认为您的第一个for循环已关闭,因为names [i]如下:
“ foo” //名称[i] = st.nextToken();
“ foo bar” //名称的第一次迭代[i] =名称[i] +“” + st.nextToken();
“ foo Bar 19.35” //名称[i] =名称[i] +“” + st.nextToken()的第二次迭代;
然后,reals [i] [0]读入整数(55),因此其值为55.0。ints [i] [0]随后引发异常,因为下一个数字是double而不是int。
因此,您的for循环应为:
for (int k = 0; k<m-5; k++)
{
name = name+ " " + st.nextToken();
}
您可能想使用String.split()首先将标记分离为数组,然后一个一个地解析它们。
String line = "foo Bar 19.35 55 987.0054 4 ";
String[] arr = line.split("[\s]+");
int m = arr.length;
.......
reals[i][0] = Double.parseDouble(arr[m - 4]);
如果您可以控制数据格式,则最好使用标准CSV。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.