解析文本文件中的数字

时间:2013-08-30 03:51:24

标签: java parsing file-io

只是想知道我在这里做错了什么。我试图从文件中读取并解析一些数据。我一直收到错误" java.lang.NumberFormatException"它无法解析数字。我知道我使用getNextDouble()或获取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();
    }

4 个答案:

答案 0 :(得分:1)

如果我理解得很好,在你的例子中

foo Bar

你读了st.nextToken三次而不是两次。 可能你需要使用这样的东西:

names[i] = "";

for (int k = 0; k<m-4; k++)
{
    names[i] = names[i] + " " + st.nextToken();
}

答案 1 :(得分:1)

卸下 你代码中的names[i] = st.nextToken();应该可以正常工作。

问题是你在进入for循环

之前就读到了第一个令牌

答案 2 :(得分:1)

在你的try / catch块中,你需要在catch块中放入一个return语句,或者你需要将其余的代码移到try块内(如果文件打开失败,即使你被抓住了错误,fileIn.HasNext肯定会失败,因为文件仍然没有打开。)

我还复制并粘贴了你的代码并通过调试器运行它,我认为你的第一个for循环是关闭的,因为name [i]如下:

“foo”// names [i] = st.nextToken();

“foo bar”//名字的第一次迭代[i] = names [i] +“”+ st.nextToken();

“foo Bar 19.35”//名称的第二次迭代[i] = names [i] +“”+ st.nextToken();

然后,实数[i] [0]读入整数(55),因此值为55.0 然后ints [i] [0]抛出异常,因为下一个数字是double而不是int。

所以你的for循环应该是:

            for (int k = 0; k<m-5; k++)
            {
                name = name+ " " + st.nextToken();
            }

答案 3 :(得分:0)

您可能希望使用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。