如何在使用Java读取文件时从文本行中提取名称和值?

时间:2010-07-26 19:58:41

标签: java file parsing

文件名将从标准输入传入。我想打开它,读取它,并根据文件中的文本创建一些信息。

例如,如果这是文件中的一行:

Hristo 3

...然后我想创建一个名为Hristo的Member(),其值为3.所以我想为名称提取String,为值提取int 。名称和值由一些未知数量的选项卡和空格分隔,我需要忽略它们。我可以只读取该行,使用.trim()来删除空格,最后一个字符是值吗?

为简单起见,我没有显示类Member()。这就是我到目前为止所做的:

public static void main(String[] args) {

    int numMembers = 0;
    ArrayList<Member> veteranMembers = new ArrayList<Member>();

    File file = new File(args[0]);
    FileReader fr;
    BufferedReader br;

    // attempt to open and read file
    try {
        fr = new FileReader(file);
        br = new BufferedReader(fr);

        String line;

        // read file
        while ((line = br.readLine()) != null) {

                // extract name and value from line
                ... ? ...

                // create member
                // initialize name and value
                Member member = new Member();
                veteranMembers.add(member);
        }
        br.close();

    } catch (FileNotFoundException e1) {
        // Unable to find file.
        e1.printStackTrace();
    } catch (IOException e) {
        // Unable to read line.
        e.printStackTrace();
    }
}

我该如何解析那行文字?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

我会使用split函数。 你可以给它一个正则表达式作为参数 即

line.split(" |\t");

将返回单词的数组({list [0] = Hristo,list [1] = 3}在你的例子中) 希望它有所帮助。

答案 1 :(得分:2)

使用split("\\s+"),此正则表达式忽略字符串中的任何空格,制表符等。

答案 2 :(得分:2)

更强大的方法可能是使用正则表达式;如果您收到格式错误的输入(例如,“Ted One”),parseInt()将抛出NumberFormatException。

import java.util.regex.*;

...

Pattern p = Pattern.compile("^(.*)\\s+(\\d+)$"); // Create a regex Pattern that only matches (text - white space - integer)
Matcher m = p.matcher(line); // Create a Matcher to test the input line
if(m.find()){
      // If there's a match, ..
    String name = m.group(1); // Set "name" to the first parenthesized group
    String value = m.group(2); // Set "value" to the second parenthesized group
}
else{
      // Bad Input
}

答案 3 :(得分:0)

看起来像家庭作业。你来得非常接近。使用StringTokenizer标记line。然后创建一个新的成员对象,并使用标记作为参数调用这两个属性的setter。如果您的第二个属性是int,请使用parseInt进行转换并分配。