2016-04-05 5 views
0

In Java, ich habe eine Datei enthält Zeilen wie:Wie finden und entfernen Sie Zeichenfolgen mit case insensitive match?

abc 
cbd 
CFG 
... 

I CFG aus der Datei entfernen möchten, wenn eine der Linien einen String match, die ‚cfg‘ sein könnten, ‚Cfg‘ oder andere case insensitive Variationen.

Wenn ich die Datei in ein Set lese, wie kann ich das erreichen? Es scheint praktikabler, dies zu tun, indem Sie die Datei in eine Liste einlesen.

+2

Sie könnte so etwas wie Groß die Zeichenfolge tun und in den Satz einfügen. – user1875195

+1

'String.equalsIgnoreCase (String str)' – robotlos

+0

Wenn Sie dann ausdrucken, haben Sie alle ursprünglichen Fälle verloren, was ich nicht brauche. – user697911

Antwort

1

Folgendes ist eine "Lambda-Version" des erforderlichen Codes. Danke an @Sam für den wichtigen Punkt über das erneute Anhängen von unterdrückten PrintWriter IOException.

Wenn Sie die Datei an Ort und Stelle ändern müssen, ist das Schreiben etwas schwieriger. Sie könnten alles zuerst in den Speicher einlesen.

Path path = new Path("filename"); 
List<String> lines = Files.lines(path) 
          .filter(line -> !line.equalsIgnoreCase("cfg")) 
          .collect(Collectors.toList()); 

try(PrintWriter pw = new PrintWriter(path.toFile())) { 
    lines.forEach(pw::println); 
    if (pw.checkError()) { 
     throw new IOException("Exception(s) occurred in PrintWriter"); 
    } 
} 

Und schließlich, nur für den Fall, eine nicht-Lambda-Lösung für die Kompatibilität mit Java 7:

Path in_file = Paths.get("infile"); 
Path out_file = Paths.get("outfile"); 
try (BufferReader reader = Files.newBufferedReader(in_file); 
     PrintWriter pw = new PrintWriter(out_file.toFile())) { 

    String line; 
    while((line = reader.readline()) != null) { 
     if (!line.equalsIgnoreCase("cfg")) { 
      pw.println(line); 
     } 
    } 
    if (pw.checkError()) { 
     throw new IOException("Exception(s) occurred in PrintWriter"); 
    } 
} 
+0

Schön! Das wusste ich nicht! – saml

+1

@Sam - Ya, handlich, 'PrintWriter'. Hätten sie nur einen '.collect (toFile (Pfad)) 'Kollektor, könnte dies ein" Einzeiler "sein! – AJNeufeld

+1

Obwohl ich gerade etwas darüber gelesen habe und es buchstäblich Ausnahmen verschluckt. Ich denke, ich wäre glücklicher, wenn es eine RuntimeException für den produktiven Einsatz auslösen würde, so dass ich zumindest etwas in einem Protokoll landen würde, wenn es ein bisschen falsch läuft. – saml

1

So etwas wie das?

Die einzige hässliche Sache ist die Notwendigkeit für zwei Versuche, weil keine Ausnahmen von lambdas geworfen werden dürfen.

+0

Ein 'PrintWriter' unterdrückt die Ausnahmen für Sie. Siehe meine Antwort. – AJNeufeld

+0

'BufferedReader # lines()' entfernt die Zeilenumbruchzeichen aus dem Zeilenstrom. Sie müssen es wieder hinzufügen, mit 'bw.write (line) .newLine();'. – AJNeufeld

+0

Whoops! 'bw.write (Zeile); bw.newLine(); 'Sie können' BufferedWriter'-Methoden nicht verketten. – AJNeufeld