Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet?

Hallo zäme


Mein Programm verarbeitet html-code zu Klartext:
<header>blablaba<body> wird zu "blablabla".

Das Programm tut grundsätzlich, was es soll. Aber es tauchen 2 Schönheitsfehler auf, die ich nicht loswerde:
  1. Die Leerzeichen aus dem Input (=html) sind im Output (=txt) verschwunden und ich hab' keine Ahnung, warum das so ist. Beispiel: Input: <title>Powers of Two</title>. Output: PowersofTwo (meine Erwartung: Powers of Two)
  2. Das Input-file hat 14 Zeilen, das Output-file hat 18 Zeilen. Wo kommen diese 4 neuen Zeilen her?

Vielen Dank im Voraus für Eure Inputs ;-)
Liebe Grüsse,
Markus

PS: input- und output-file sind exemplarisch angehängt.
input: kapitel83a4for3.html
output: kapitel84a6output.txt


Java:
import java.io.*;
import java.util.*;

public class kapitel84a6 {

    public static void main (String[] args) throws IOException{
        // Scanner for user input
        Scanner user = new Scanner( System.in );
        String  inputFileName, outputFileName;

        // prepare the input filkapite
        System.out.print("Input File Name: ");
        inputFileName = user.nextLine().trim();
        File input = new File( inputFileName );   
        Scanner scan = new Scanner( input );   

        // prepare the output file
        System.out.print("Output File Name: ");
        outputFileName = user.nextLine().trim();
        PrintWriter output = new PrintWriter(outputFileName);
      
        //Variablen für while-loop initialisieren
        char charToken = '0';
        boolean trigger = true;
        String char2String="";
        int lineCounter=0;
        String word = "";

        // processing loop
        while( scan.hasNext() )
        {
            lineCounter++;
            String stringToken = scan.next(); //einlesen einer einzelnen Zeile. Wär' nextLine oder gar readLine besser?

            //loop für die einzelnen characters, gültig für jeweils 1 Zeile
            output.print("Zeile "+lineCounter+":\t");
            for (int i=0; i<stringToken.length(); i++){
                //trigger=true; //Zur Sicherheit, es soll im Zweifel recorded werden. War FALSCH; weil das soll ja NICHT für jedes Zeichen neu eruiert werden!
                charToken=' '; //auch zur Sicherheit, falls darin noch Reste aus letztem Durchlauf sind

                charToken=stringToken.charAt(i);
                if (charToken=='<'){ //"send 2 printer" abschalten
                    trigger=false;
                }
                if (charToken=='>'){ //"send 2 printer" wieder anschalten
                    trigger=true;
                }


                //neue Variante: String generieren
                if (trigger==true){ //hier werden die chars für ein Wort gesammelt
                    if (charToken=='>'){}
                    else {
                        char2String=Character.toString(charToken);
                        word+=char2String;
                    }
                }
                if (trigger==false){//hier werden die im vorherigen if gesammelten chars geprintet
                    output.print(word+" "); //Ausgabe des einzelnen Worts ins txt
                    System.out.print(word+" "); //Zur Kontrolle am Bildschirm
                    word=""; //Variable nullen für nächste Runde
                }

      

                /* alte char-Variante
                Der Trigger ist nun auf true, wenn < kommt und auf false, wenn > kommt
                Wenn true gesetzt ist, werden die chars NICHT weiter ins output geroutet
              
                if (trigger==true){
                    //Ausgabe des einzelnen chars/Strings ins txt
              
                    if (charToken=='>'){}
                    else {
                        char2String=Character.toString(charToken);
                        output.print(char2String); //Ausgabe des einzelnen chars/Strings ins txt
                    }
                }
                */
            }
            output.println();
        }
        // close the output file
        output.close();
    }
}
 

Anhänge

Also erst einmal: scan.next() liest nicht eine Zeile sondern das nächste token. Daher ist der Kommentar irreführend, dass Du die Zeile einliest.

Das Verhalten kannst Du also bestimmt selbst ergründen, wenn Du einfach einmal die stringToken, die du gelesen hast, direkt ausgibst.

Genereller Hinweis: Da Token für Token gelesen wird, bekommst Du keine Leerzeichen. Und Du baust ja so lange auf, bis trigger==false, d.h. mehrere Token mit Text hängst Du einfach aneinander ...

Das erklärt dann beide Effekte: Das erste, dass mehr Zeilen in der Ausgabedatei sind und das zweite, dass alles zusammen hängt.
 

Zurück
Oben