Ввод Java из отформатированного файла - PullRequest
1 голос
/ 30 ноября 2010

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

например, формат: название книги, автор: второе имя заемщика Имя: состояние заемщика

вот некоторыепример строки.

The Lord of the Rings, JRR Tolkien:McInnes Elizabeth:13 11 10

Crime And Punishment, Fyodor Dostoyevsky

The Clan Of The Cave Bear, Jean M Auel

The God Of Small Things, Arundhati Roy:Robins Joshua:20 11 10

Поэтому я попытался использовать useDelimiter после настройки сканера, но, поскольку некоторые строки короче, я не совсем понимаю, что делать.

Ответы [ 5 ]

4 голосов
/ 30 ноября 2010

Вот решение, основанное на регулярных выражениях:

import java.io.*;
import java.util.regex.*;

public class Test {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader("data.txt"));

        Pattern p = Pattern.compile("(.+?),(.+?)(?::(.+?):(\\d+ \\d+ \\d+))?");

        String line;
        while (null != (line = br.readLine())) {
            Matcher m = p.matcher(line);
            if (m.matches()) {
                String title = m.group(1);
                String author = m.group(2);
                String borrower = m.group(3);
                String data = m.group(4);

                System.out.println("Title:  " + title);
                System.out.println("Author: " + author);
                if (borrower != null) {
                    System.out.println("    Borrower: " + borrower);
                    System.out.println("    Data:     " + data);
                }
            }
            System.out.println();
        }

        br.close();
    }
}

Учитывая ваш пример ввода, оно печатает:

Title:  The Lord of the Rings
Author:  JRR Tolkien
    Borrower: McInnes Elizabeth
    Data:     13 11 10

Title:  Crime And Punishment
Author:  Fyodor Dostoyevsky

Title:  The Clan Of The Cave Bear
Author:  Jean M Auel

Title:  The God Of Small Things
Author:  Arundhati Roy
    Borrower: Robins Joshua
    Data:     20 11 10
0 голосов
/ 30 ноября 2010

Почему всегда для таких тривиальных задач предлагаются такие негабаритные инструменты, как регулярные выражения? Почему бы просто не использовать старые добрые line.indexOf() или line.lastIndexOf() методы?

0 голосов
/ 30 ноября 2010

Вы можете использовать .split ()

try {
    FileInputStream fstream = new FileInputStream("input.txt");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line;
    String author;
    String title;
    String borrower;
    String date;

    while ((line = br.readLine()) != null)   {
      (author,title) = line.split(",");

      if (line.contains(":")
        (title,borrower,date) = title.split(":");

      /*** Do what you need to do with the values here ***/
    }

    in.close();

} catch (Exception e) {
    e.printStackTrace();
}
0 голосов
/ 30 ноября 2010

Я бы разбил каждую строку (используя String.split), передавая двоеточие в качестве разделителя.Затем используйте lastIndexOf (',') для первого элемента, возвращенного split, чтобы отделить автора от книги:

public class ReadCrappyInput {

    public static List<String> testData() {
        List<String> lines = new ArrayList<String>();
        lines.add("The Lord of the Rings, JRR Tolkien:McInnes Elizabeth:13 11 10");
        lines.add("Crime And Punishment, Fyodor Dostoyevsky");
        lines.add("The Clan Of The Cave Bear, Jean M Auel");
        lines.add("The God Of Small Things, Arundhati Roy:Robins Joshua:20 11 10");
        return lines;
    }

    public Map<String, String> readLine(String line) {
        String[] parts = line.split(":");
        int endOfTitleIndex = parts[0].lastIndexOf(',');
        Map<String, String> map = new HashMap<String, String>();
        map.put("title", parts[0].substring(0, endOfTitleIndex));
        map.put("author", parts[0].substring(endOfTitleIndex + 1).trim());    
        if (parts.length > 1) {
            map.put("borrower", parts[1]);
        }
        if (parts.length > 2) {
            map.put("data", parts[2]);
        }
        return map;
    }

    public static void main(String[] args) {
        ReadCrappyInput r = new ReadCrappyInput();
        for (String s : testData()) {
            System.out.println(r.readLine(s));
        }
    }
}
0 голосов
/ 30 ноября 2010

Читайте файл построчно, используйте регулярное выражение [^,:] для сопоставления данных в каждой строке (последовательное find приведет к названию, автору и заемщику, состоянию, если есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...