繁体   English   中英

解析文本文件中的数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM