Input/Output 2 Textdateien mit einander vergleichen

Fufonfuul

Mitglied
Hallo Allerseits :)
bin Informatikstudent im 1. Semester und und soll ein Programm schreiben welches Textdateien zeilenweise miteinander vergleicht. Sitzte da schon mehrere Stunden dran aber weiß nicht genau wie ich die Fehler beheben kann.

Hier ist mal mein bereits geschriebener Code:

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

public class Diff {   
    public static void main(String[] args) throws FileNotFoundException {
        diff();
    }

    public static void diff() {
        Scanner datei1=null, datei2=null;
        String text1, text2;
        int zeile = 0;
        try {
            datei1 = new Scanner(new File("text1.txt"));
            datei2 = new Scanner(new File("text2.txt"));
            do {                           
                text1 = datei1.nextLine();
                text2 = datei2.nextLine();
                zeile++;               
                if (text1.compareTo(text2) <0 | text1.compareTo(text2) >0)  {
                    System.out.println("Zeile "+zeile+":");
                    System.out.println("< "+text1);
                    System.out.println("> "+text2);
                    System.out.println();                                                     
                }else {
                    continue;
                }           
            } while (datei1.hasNextLine() && datei2.hasNextLine());
           
        }catch (FileNotFoundException notFound) {
            System.out.println("Datei nicht gefunden");
            return;
        }catch (NoSuchElementException noLine) {
            System.out.println("Eine der Dateien ist zu lang"); /** tritt ein falls eine der Dateien
                                                         länger als die andere ist*/
            return;
        }finally {
            if (datei1 !=null) datei1.close();
            if (datei2 !=null) datei2.close();
        }
    }           
}

Der Code soll mir die Zeilennummer ausgeben wo sich die Zeilen in Datei 1 und 2 unterscheiden, so etwa in diesem Muster :
Zeile xy:
< String hier so
> String hier anders

So weit so gut, das Ding ist aber, dass sobald eine Datei mehr Zeilen hat als die andere sollen diese als leere Zeilen gewertet werden und dementsprechend wieder mit der anderen Datei verglichen werden. habe schon viele Lösungen gesehen die "BufferedReader" verwenden, leider soll ich diesen nicht verwenden. Ich hoffe ihr habt meine Frage verstanden und könnt mir helfen :D
lg
 

mrBrown

Super-Moderator
Mitarbeiter
BufferedReader braucht man dafür nicht, das klappt ganz wunderbar mit Scanner.

Du musst es nur so umbauen, dass du nicht einfach immer von beiden Dateien die nächste Zeile liest, sondern nur jeweils von einer Datei, wenn diese noch weitere Zeilen hat (wie du das prüfst, hast du bereits verwendet), und wenn sie keine Zeilen mehr hat, musst du mit einem sinnvollen Default-Wert weiter arbeiten.

Anders als du es aktuell tust, muss die Schleife dann so lange laufen, wie eine Datei noch weitere Zeilen hat.
 
X

Xyz1

Gast
Von Scanner würde ich abraten, ungeeignetes Werkzeug dafür, davon es selber zu schreiben auch. Es gibt Tools genau dafür.

Die Frage ist was mit zusätzlichen Zeilen welche in einer aber in der anderen Datei nicht vorkommen geschehen sollen.
 

Fufonfuul

Mitglied
Leider ist es eine Aufgabe für meine Hochschule und ich soll mit dem Scanner vorgefertigete Dateien einlesen lassen. Ich versuche mich gerade an den Vorschlag von mrBrown und versuche }else if statements einzubauen falls eine der Dateien keine Zeile mehr zum einlesen hat (habe den Vorschlag zumindest so interpretiert) und die "kürzere" Datei dann schließt.
 

Fufonfuul

Mitglied
Ok es ist schwer als ich erwartet habe oder ich stelle mich gerade etwas dämlich an, bin leider noch frisch was das Programmieren angeht >.<
Der Compiler spuckt mir ne Fehlermeldung aus:

Diff.java:29: error: cannot find symbol
}else if (text1.hasNext() ==false) {
^
symbol: method hasNext()
location: variable text1 of type String

Java:
 }else if (text1.hasNext() ==false) {
                    datei1.close();
                    System.out.println("Zeile "+zeile+":");
                    System.out.println("< ");
                    System.out.println("> "+text2);
                    System.out.println();
 }
Kann ich die Condition überhaupt so deklarieren?(offensichtlich nicht sonst würde der Compiler keine Fehlermeldung ausgeben)
 

Fufonfuul

Mitglied
Kann ihr gerne nochmal posten aber viel geändert ist daran nichts im Vergleich zu oben. Der einzige Unterschied sind sind die }else if Statements wenn eine der Dateien größer ist als die andere und ich habe die Condition für die do/while Schleife etwas angepasst (dank Hinweis von mrBrown)
Java:
import java.io.*;
import java.util.*;

public class Diff {   
    public static void main(String[] args) throws FileNotFoundException {
        diff();
    }
   
    public static void diff() {
        Scanner datei1=null, datei2=null;
        String text1, text2;
        int zeile = 0;
        try {
            datei1 = new Scanner(new File("text1.txt"));
            datei2 = new Scanner(new File("text2.txt"));
            do {                           
                text1 = datei1.nextLine();
                text2 = datei2.nextLine();
                zeile++;               
                if (text1.compareTo(text2) <0 | text1.compareTo(text2) >0)  {
                    System.out.println("Zeile "+zeile+":");
                    System.out.println("< "+text1);
                    System.out.println("> "+text2);
                    System.out.println();                                                     
                }else if (text1.hasNext() ==false) {
                    datei1.close();
                    System.out.println("Zeile "+zeile+":");
                    System.out.println("< ");
                    System.out.println("> "+text2);
                    System.out.println();
                }else if (text2.hasNext() ==false) {
                    datei2.close();
                    System.out.println("Zeile "+zeile+":");
                    System.out.println("< "+text1);
                    System.out.println("> ");
                    System.out.println();
                }else {
                    continue;
                }
            } while (datei1.hasNextLine() | datei2.hasNextLine());               
        }catch (FileNotFoundException notFound) {
            System.out.println("Datei nicht gefunden");
            return;
        }catch (NoSuchElementException noLine) {
            System.out.println("Eine der Dateien ist zu lang");
            return;       
        }finally {
            if(datei1 !=null) datei1.close();
            if(datei2 !=null) datei2.close();
        }
    }           
}
 

Robat

Top Contributor
Die Änderung beschreibt noch nicht 100%ig das, was @mrBrown oben beschrieben hatte. Du liest ja trotzdem bei jeder Iteration von beiden Dateien eine Zeile ein (was sicherlich zu einer Exception führt, weil du ggf. den Stream vorher schließt mit datei.close().

Zu deinem eigentlichen Problem: schau mal genau, auf welchem Objekt du gerade hasNext() aufrufst. text1 bzw text2 sind Strings - keine Scanner. :)

Off-Topic: Gewöhn' dir an für boolsche Vergleiche || zu nutzen. | nutzt man i.d.R. nur für Bit-Operationen. (würde aber in dem Fall keinen Unterschied machen).
 
X

Xyz1

Gast
Machst Du so :)
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @Date 05.12.2018
 */
public class Diff {

    public static void main(String[] args) {
        String a = "bla1\n"
                + "bla2\n"
                + "bla3\n"
                + "bla4\n"
                + "bla5";
        String b = "bla4\n"
                + "bla4\n"
                + "bla4\n"
                + "bla4\n"
                + "bla4\n"
                + "bla1\n"
                + "bla2\n"
                + "bla9\n"
                + "bla4\n"
                + "bla5";

//        String zwischen = a;
//        a = b;
//        b = zwischen;

        List<String> c = new ArrayList<>();
        List<String> d = new ArrayList<>();
        try (Scanner e = new Scanner(a); Scanner f = new Scanner(b)) {
            while (e.hasNextLine()) {
                c.add(e.nextLine());
            }
            while (f.hasNextLine()) {
                d.add(f.nextLine());
            }
        }
        List<String> g = new ArrayList<>();
        List<String> h = new ArrayList<>();
        for (int i = 0; i < c.size(); i++) {
            for (int j = i; j < d.size(); j++) {
                if (c.get(i).equals(d.get(j))) {
                    g.add(c.get(i) + " " + d.get(j) + " " + i + " " + j);
                    break;
                }
            }
        }
        for (int i = 0; i < d.size(); i++) {
            for (int j = i; j < c.size(); j++) {
                if (d.get(i).equals(c.get(j))) {
                    h.add(d.get(i) + " " + c.get(j) + " " + i + " " + j);
                    break;
                } else {
                    // ?
                }
            }
        }
        if (g.size() >= h.size()) {
            g.stream().forEach(System.out::println);
        } else {
            h.stream().forEach(System.out::println);
        }
    }

}
 

mihe7

Top Contributor
Vielen dank für diesen wertvollen Tipp. Hilft mir wirklich sehr auf sowas hinzuweisen
Naja, der Compiler sagt Dir genau, wo das Problem liegt. Was soll man dazu noch großartig sagen? Falsche Variable verwendet.

Dein Code am Anfang war ja fast fertig. Die Anpassung ist trivial: Du musst vor dem Einlesen der jeweiligen Zeile einfach abprüfen, ob es weitere Daten gibt.

Java:
String line1 = "";
if (datei1.hasNextLine()) {
    line1 = datei1.nextLine();
}
liefert die nächste Zeile aus der Datei oder "", wenn es keine solche gibt.

Ansonsten musst Du im while nur die Verknüpfung zu einem OR ändern - hast Du bereits gemacht. Ich würde aus der do-while auch eine while-Schleife machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
_0815_ Problem mit dem Automatischen eintragen in Textdateien Java Basics - Anfänger-Themen 1
S 4 große Textdateien zu einer Mergen Java Basics - Anfänger-Themen 5
K Textdateien vergleichen optimieren Java Basics - Anfänger-Themen 9
Z Textdateien einlesen und verarbeiten Java Basics - Anfänger-Themen 3
Bluedaishi Textdateien splitten, neu schreiben Java Basics - Anfänger-Themen 13
H Textdateien in Ordner einlesen - unendlich ? Java Basics - Anfänger-Themen 8
T mehrere Benutzer greifen auf Textdateien zu Java Basics - Anfänger-Themen 3
H Vergleichen mit mehreren Textdateien Java Basics - Anfänger-Themen 2
MilchToast Teilstrings aus unbekannt großen Textdateien extrahieren. Java Basics - Anfänger-Themen 5
B Textdateien erweitern Java Basics - Anfänger-Themen 7
A Zugriff auf Textdateien und Datenbanken Java Basics - Anfänger-Themen 3
D textdateien manipulieren, welche klasse? wie? Java Basics - Anfänger-Themen 8
T Textdateien mit Unicode-Zeichen kopieren Java Basics - Anfänger-Themen 2
F mehrer Textdateien Inhalte in eine TXT Datei Java Basics - Anfänger-Themen 16
H in Textdateien etwas schreiben bzw. speichern Java Basics - Anfänger-Themen 2
cowabunga1984 Auslesen von Informationen aus Textdateien Java Basics - Anfänger-Themen 2
J in Textdateien speichern - aus Textdateien auslesen Java Basics - Anfänger-Themen 5
G Textdateien bearbeiten Java Basics - Anfänger-Themen 22
G Bilder und Textdateien aus jar einbinden Java Basics - Anfänger-Themen 7
F Zugriff auf Textdateien über URL Java Basics - Anfänger-Themen 2
E Zwei Textdateien in eine kopieren Java Basics - Anfänger-Themen 5
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
CptK Interface 2 von einander unabhängige Frames mit Panel gleichzeitig nutzen Java Basics - Anfänger-Themen 66
M Elemente in einer ArrayList einander zuordnen. Java Basics - Anfänger-Themen 18
K zwei GregorianCalender Datums von einander abziehen-> Problem! Java Basics - Anfänger-Themen 7
Joew0815 Zwei ArrayListen mit einander vergleichen Java Basics - Anfänger-Themen 33
Z Feld prüfen ob 3 gleiche zahlen nach einander vorkommen Java Basics - Anfänger-Themen 3
G zwei java nach einander ausführen Java Basics - Anfänger-Themen 14
O uhrzeit mit einander vergleichen Java Basics - Anfänger-Themen 10
G Frames mit einander verbinden Java Basics - Anfänger-Themen 10
G 2 Vorgänge nach einander ablaufen zu lassen Java Basics - Anfänger-Themen 13
M 2 Datum mit einander vergleichen ??? Java Basics - Anfänger-Themen 7
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
J ArrayList vergleichen im spiel Mastermind Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
M 3 Zahlen miteinander vergleichen Java Basics - Anfänger-Themen 18
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
B bei 2 Arrays Anzahl gleicher Elemente vergleichen? Java Basics - Anfänger-Themen 49
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
S Den Minimumberechnen 2 codes vergleichen Java Basics - Anfänger-Themen 4
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
districon Vergleichen von Objekten Java Basics - Anfänger-Themen 20
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
M Strings vergleichen Java Basics - Anfänger-Themen 10
J Zufallszahlen generieren und Werte vergleichen Java Basics - Anfänger-Themen 3
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
O String mit Character vergleichen Java Basics - Anfänger-Themen 3
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
N 2D Arrays jedes xy vergleichen Java Basics - Anfänger-Themen 7
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
R String vergleichen Java Basics - Anfänger-Themen 59
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
C System.in.read() Boolsche Werte vergleichen Java Basics - Anfänger-Themen 8
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
E Zahlen von einem Array mit zahlen von zweitem Array vergleichen Java Basics - Anfänger-Themen 27
A Suffix vergleichen Java Basics - Anfänger-Themen 2
L Erste Schritte Elemente zwei Schlangen vergleichen Java Basics - Anfänger-Themen 14
PaperHat Objekte in Array vergleichen Java Basics - Anfänger-Themen 9
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
M String vergleichen Java Basics - Anfänger-Themen 5
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
S Array, Geburtsdatum, Vergleichen Java Basics - Anfänger-Themen 28
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
L Variablen Versionsnummern vergleichen Java Basics - Anfänger-Themen 5
N Methoden int[]'s vergleichen Java Basics - Anfänger-Themen 4
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
T JPasswordFielder vergleichen Java Basics - Anfänger-Themen 16
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Werte in Liste mit Nachfolger vergleichen Java Basics - Anfänger-Themen 5
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
J Zahlensequenz mit einer anderen Sequenz vergleichen Java Basics - Anfänger-Themen 6
P String größer kleiner gleich vergleichen Java Basics - Anfänger-Themen 6
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
J Methoden BinaryStrings vergleichen Java Basics - Anfänger-Themen 12
C arrey mit string vergleichen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben