2010-11-30 5 views
1

J'essaie d'obtenir une entrée d'un fichier qui a différentes lignes.Java Entrée à partir du fichier formaté

par exemple. le format est le titre du livre, auteur: second nom de l'emprunteur Prénom: l'état de l'emprunteur

Voici quelques exemples de lignes.

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 

J'ai donc essayé d'utiliser useDelimiter après la mise en place d'un scanner, mais depuis une ligne sont plus courtes que je ne le font pas tout à fait pas ce qu'il faut faire.

+0

Pouvez-vous modifier la structure du fichier d'entrée? –

+4

Que se passe-t-il si le titre du livre contient une virgule? –

+0

h o m e w k? – Mot

Répondre

0

Lire le fichier ligne par ligne, utiliser l'expression régulière [^,:] pour faire correspondre les données dans chaque ligne (séquentiel find apportera titre, auteur et emprunteur, état, le cas échéant).

4

Voici une solution basée sur les expressions régulières:

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(); 
    } 
} 

Compte tenu de votre entrée de l'échantillon, il imprime:

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

Vous monsieur, prenez votre Regex-fu avec un côté de Java. J'applaudis l'exhaustivité de l'exemple. –

+0

Très apprécié, c'est exactement ce dont j'avais besoin. – user525676

0

Je diviser chaque ligne (en utilisant String.split) en passant dans le côlon comme délimiteur. Ensuite, utilisez lastIndexOf (« ») sur le premier élément retourné par scission afin de séparer l'auteur du livre:

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

Vous pouvez utiliser .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

Merci, je vais adapter votre version. Essayer de définir le modèle de délimiteur n'a jamais fonctionné pour moi, et j'ai perdu beaucoup de temps par-dessus. – user525676

0

Pourquoi toujours cette tâches triviales tels outils surdimensionnés comme des expressions régulières sont suggérées? Pourquoi ne pas simplement utiliser les bonnes vieilles méthodes line.indexOf() ou line.lastIndexOf()?

Questions connexes