2016-04-01 13 views
0

Ich lese eine Textdatei, die Filmtitel, Jahr, Sprache usw. enthält. Ich versuche, diese Attribute zu greifen.Wie man Text von einer unordentlichen Schnur in Java ergreift?

eine Schnur sind wie folgt Angenommen:

String s = "A Fatal Inversion" (1992)" 
String d = "(aka "Verhngnisvolles Erbe" (1992)) (Germany)" 
String f = "\"#Yaprava\" (2013) " 
String g = "(aka \"Love Heritage\" (2002)) (International: English title)" 

Wie kann ich packen Titel, Jahr, Land, wenn angegeben wird, welche Art von Titel, wenn von diesem angegeben?

Ich bin nicht sehr gut in der Verwendung von Regex und Mustern, aber ich weiß nicht, wie man es findet, welche Art von Attribut es ist, wenn sie nicht angegeben sind. Ich mache das, weil ich versuche, XML aus einer Textdatei zu generieren. Ich habe das dtd dafür, aber ich bin nicht sicher, dass ich es brauche, um es in diesem Fall zu verwenden.

Edit: Hier ist was ich versucht habe.

+1

nach Ihren Versuchen. –

+1

die Daten sind zu viel chaotisch und inkonsistent. Da die Daten zunehmen, wird es auch zu Inkonsistenzen kommen und es wird zunehmend schwieriger, die Daten zu erfassen. – rock321987

+0

@AvinashRaj check edit. danke – user2775042

Antwort

1

Ich schlage vor, Sie extrahieren das Jahr zuerst, da dies ziemlich konsistent scheint. Dann würde ich das Land herausziehen (wenn vorhanden) und der Rest nehme ich an, ist der Titel.

Zum Extrahieren der Länder empfehle ich, ein Regex-Muster mit den Namen bekannter Länder hart zu codieren. Es kann einige Iterationen dauern, um festzustellen, was diese sind, da sie ziemlich inkonsistent zu sein scheinen.

Dieser Code ist ein bisschen hässlich (aber dann ist, so dass die Daten!):

public class Extraction { 
    public final String original; 
    public String year = ""; 
    public String title = ""; 
    public String country = ""; 

    private String remaining; 

    public Extraction(String s) { 
     this.original = s; 
     this.remaining = s; 
     extractBracketedYear(); 
     extractBracketedCountry(); 
     this.title = remaining; 
    } 

    private void extractBracketedYear() { 
     Matcher matcher = Pattern.compile(" ?\\(([0-9]+)\\) ?").matcher(remaining); 
     StringBuffer sb = new StringBuffer(); 
     while (matcher.find()) { 
      this.year = matcher.group(1); 
      matcher.appendReplacement(sb, ""); 
     } 
     matcher.appendTail(sb); 
     remaining = sb.toString(); 
    } 

    private void extractBracketedCountry() { 
     Matcher matcher = Pattern.compile("\\((Germany|International: English.*?)\\)").matcher(remaining); 
     StringBuffer sb = new StringBuffer(); 
     while (matcher.find()) { 
      this.country = matcher.group(1); 
      matcher.appendReplacement(sb, ""); 
     } 
     matcher.appendTail(sb); 
     remaining = sb.toString(); 
    } 

    public static void main(String... args) { 

     for (String s : new String[] { 
       "A Fatal Inversion (1992)", 
       "(aka \"Verhngnisvolles Erbe\" (1992)) (Germany)", 
       "\"#Yaprava\" (2013) ", 
       "(aka \"Love Heritage\" (2002)) (International: English title)"}) { 

      Extraction extraction = new Extraction(s); 
      System.out.println("title = " + extraction.title); 
      System.out.println("country = " + extraction.country); 
      System.out.println("year = " + extraction.year); 
      System.out.println(); 
     } 
    } 

} 

Produziert:

title = A Fatal Inversion 
country = 
year = 1992 

title = (aka "Verhngnisvolles Erbe")  
country = Germany 
year = 1992 

title = "#Yaprava" 
country = 
year = 2013 

title = (aka "Love Heritage") 
country = International: English title 
year = 2002 

Sobald Sie diese Daten haben, können Sie es weiter bearbeiten können (zB "International: Englischer Titel" -> "England").

+0

Hallo, Danke für die Antwort. Allerdings ist es möglich, die Regex so einzustellen, dass ich das Land aus einer Zeichenfolge "aka \" Teatre Català amb Manel Fuentes \ "(2004)) \t (Spanien: katalanische Titel) (Arbeitstitel)" Weil an In dem Moment, in dem die Regex einen Wortumbruch hat, passt es nur, wenn es nur Spanien in Klammern ist. Wie würde ich das beheben? – user2775042

+0

Wie Stack Overflow funktioniert, müssen Sie dies als neue Frage stellen. Versuchen Sie, sich auf das spezifische Problem zu konzentrieren und was Sie versucht haben usw. –

Verwandte Themen