2010-11-30 3 views
1

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

например. формат Заглавие книги, Автор: Заемщик ФИО: Заемщик состояние

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

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 после настройки сканера, но так как некоторые линии короче я не не совсем то, что делать.

+0

Можете ли вы изменить формат входного файла? – 2010-11-30 20:25:54

+4

Что произойдет, если название книги содержит запятую? – 2010-11-30 20:27:11

+0

h o m e w o r k? – Mot 2010-11-30 20:48:52

ответ

0

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

4

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

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

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

package com.ndh.junk; 

import java.util.*; 

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

Вы можете использовать .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

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

Смежные вопросы