2016-03-20 13 views
1

Es fällt mir schwer das erste Wort von jeder Zeile zu bekommen. Irgendwelche Ideen, warum es leere Dateien ausgibt?Das erste Wort von jeder Zeile erhalten?

Das Programm führt den folgenden Text als Eingabe:

abecedism word created from the initials of words in a phrase 
ablaut variation in root vowel of words to change meaning 
acronym word formed from initial letters of another word 
acrophonic using a symbol for the initial sound of a thing 
acroteleutic phrase or words at the end of a psalm 
adversative word or phrase expressing opposition 

Und das Ziel ist es, die Ergebnisse zu erhalten, wie folgt aussehen:

abecedism 
ablaut 
acronym 
acrophonic 
acroteleutic  
adversative 

Hier ist der Code so weit:

public static void main(String args[]) { 
    String fileNameOutput = "OutputFile.txt"; 
    String fileName = "InputWords.txt"; 
    Charset cs = Charset.defaultCharset(); 
    try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)) { 
     PrintWriter outputStream = new PrintWriter(fileNameOutput); 
     int lineNum = 0; 
     String line = null; 
     while ((line = bReader.readLine()) != null) { 
      lineNum++; 
      if (line.split(" ").length > 1) continue; 
      outputStream.println(line); 
     } 
     outputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Was passiert, wenn mehr als ein Leerzeichen zwischen diesen beiden Wörtern aus der ersten Zeile "abecedism word" steht? Deine 'line.split (" ")' wird hier nicht funktionieren. – bili

Antwort

3
if (line.split(" ").length > 1) continue; 

Kontrollen zu schneiden, wenn Zeile mehr als ein Wort/Token enthält, und wenn dies der Fall startet er sofort neue Iteration, die bedeutet, dass Sie das Überspringen Rest des Codes nach continue, die Sie von

in Ihrer Datei
outputStream.println(line); 

und da jede Zeile der Ausführung verhindert hat mehr als ein Wort, das Sie nichts hinzufügen, Datei zu führen.


Ihr Code könnte wahrscheinlich ein wenig mit Scanner-Klasse vereinfacht werden, die uns über Worte/Token mit next() Verfahren zu durchlaufen kann.

try (Scanner sc = new Scanner(new File(fileName)); 
    PrintWriter outputStream = new PrintWriter(fileNameOutput);) { 
    while (sc.hasNextLine()) { 
     outputStream.println(sc.next());// write first word from line 
     sc.nextLine();// consume rest of text from that line 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Hinweis: Rufen Sie nicht close() innerhalb versuchen Abschnitt. Wenn eine Ausnahme auftreten würde outputStream.close(); für Ihre PrintWriter outputStream würde nicht aufgerufen werden, die eine Menge Probleme machen könnte. Sie sollten die Deklaration verschließbarer Ressourcen als Teil von Try-with-Resources verschieben.

+0

Das tat den Trick! Danke Kumpel. Habe Stunden mit diesem verdammten Problem verbracht –

1

Verwenden Sie einfach String#split(String), um es auf Platz zu teilen. Das Ergebnis ist ein Array. Wählen Sie den ersten Index der letzteren.

outputStream.println(line); 

sollte mit

outputStream.println(line.split(" ")[0]); 

PS ersetzt werden: Für diese if (line.split(" ").length > 1) continue; arbeiten müssen Strings zu erlauben, mit mehr als einem Wort geändert werden.

+0

nah diese Aussage wird nicht ausgeführt, wenn die Bedingung falsch ist, was es ist. (gibt immer noch eine leere Datei) –

+0

@JonathanLaliberte Ich sah es einfach. Was bedeutet diese Bedingung? Warum ist es da? –

+0

Es sollte überprüft werden, ob nach dem ersten Wort ein Leerzeichen steht xD –

3

Das Problem liegt hier:

if (line.split(" ").length > 1) continue; 

Jede Zeile mehr als 1 Raum hat, so dass der Code:

outputStream.println(line.split(" ")[0]); 

nie ausgeführt wird, da continue springt direkt zum nächsten, während Iteration So entfernen die if (line.split(" ").length > 1) continue; Check

EDIT Added line.split (“„) [0] nur in gedruckter Nachricht erhalten erste Wort

+0

Ah danke lol. Aber es bleibt noch ein Problem. Diese Lösung liefert Ergebnisse, bei denen die ersten zwei Wörter für jede Zeile ausgedruckt werden. Irgendwelche Ideen, wie es geändert werden kann, um nur das erste Wort zu bekommen? –

1

Das split nicht erforderlich ist, können Sie im Grunde

while ((line = bReader.readLine()) != null) { 
    lineNum++; 
    int spaceIndex = line.indexOf(" "); 
    String firstWord = spaceIndex > -1 ? line.substring(0, spaceIndex) : line; 
    outputStream.println(firstWord); 
} 

Sie können einen weiteren Scheck hinzufügen, wenn die Zeile leer ist ...

+0

erzeugt eine leere Datei –

+0

@ JonathanLaliberte yeah, Sie müssen das 'FirstWord'' drucken'. Ich habe hinzugefügt, dass in meiner Antwort, obwohl es irgendwie offensichtlich war ... – radoh

1

Das ist es

public static void main(String args[]){ 

    String fileNameOutput = "OutputFile.txt"; 
     String fileName = "InputWords.txt"; 

     Charset cs = Charset.defaultCharset() ; 
     try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)){ 

      PrintWriter outputStream = new PrintWriter(fileNameOutput); 
      int lineNum = 0; 
      String line = null; 

      while ((line = bReader.readLine()) != null) { 
       lineNum++; 

       outputStream.println(line.split(" ")[0]); 

      } 
       outputStream.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

}

+0

Diese Ergebnisse scheinen auch die ersten zwei Wörter jedes Satzes und nicht eine .. auszugeben. –

1

müssen Sie den Wert des Index der finden verwenden erste Leerzeichen dann Methode substring die Zeichenfolge Linie von 0 bis Index von f

1

wenn Sie Eingabe als Zeichenfolge, die Sie einfach einen regulären Ausdruck, um es verwenden können

String[] words = input.split("[ ].*$*[\n\r]{0,}"); 

und wenn Sie beim Lesen von Datei werden dann entweder Sie können ganze Zeichenfolge aus der Datei mit

String input = new String(Files.readAllBytes(Paths.get("..your path.."))); 
lesen

oder Sie können über jede Zeile iterieren, wenn Sie große Daten haben und dies nicht auf einen Blick tun möchten, dann können Sie auch andere Ansätze verfolgen und das erste Wort aus jeder Zeile extrahieren.

Verwandte Themen