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 

は、だから私はスキャナを設定した後use​​Delimiter使用しようとしましたが、一部の行が短いので、私はかなり何をしないようにしないでください。

+0

入力ファイルの形式を変更できますか? –

+4

書籍のタイトルにコンマが含まれているとどうなりますか? –

+0

h o m e w o r k? – Mot

答えて

0

ファイルを1行ずつ読み込み、[^,:]正規表現を使用して、各行のデータと一致させます(逐次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 
+1

あなたは、Regex-fuをJava側で持っています。私はこの例の完成度に拍手を送る。 –

+0

非常に感謝します、これは私が必要としていたものです。 – user525676

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

ありがとう、私はあなたのバージョンに適応するつもりです。デリミタのパターンを設定しようとすると、私のために働いたことはありませんでした、そして、私はそれの上に多くの時間を無駄にしました。 – user525676

0

なぜいつも、このような用正規表現のような特大のツールが提案されていますか?良い古いline.indexOf()またはline.lastIndexOf()メソッドを単に使用しないでください。

関連する問題