Как извлечь имя и значение из строки текста при чтении из файла с использованием Java? - PullRequest
1 голос
/ 26 июля 2010

Имя файла будет передано из стандартного входа. Я хочу открыть его, прочитать его и создать некоторую информацию на основе текста в файле.

Например, если это строка вфайл:

Hristo 3

... затем я хочу создать Member() с именем Hristo со значением 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 ]

3 голосов
/ 27 июля 2010

Я бы использовал функцию разделения. Вы можете дать ему регулярное выражение в качестве аргумента т.е.

line.split(" |\t");

вернет массив слов ({list [0] = Hristo, list [1] = 3} в вашем примере) Надеюсь, это поможет.

2 голосов
/ 27 июля 2010

Более надежным способом может быть использование регулярных выражений; если вы получили некорректный ввод (например, «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
}
2 голосов
/ 27 июля 2010

Используйте split("\\s+"), это регулярное выражение игнорирует любые пробелы, табуляции и т. Д. Из строки.

0 голосов
/ 27 июля 2010

Похоже на домашнюю работу.Вы подошли очень близко, делая это.Используйте StringTokenizer для токенизации line.Затем создайте новый объект-член и и вызовите сеттеры для обоих атрибутов с токенами в качестве параметров.Если вашим вторым атрибутом является int, используйте parseInt, чтобы преобразовать и назначить его.

...