XML Vergleich

Zertos

Mitglied
Ich hab ein kleines Problem beim Schreiben einer Datei.
Und zwar es geht um Folgendes:
Es geht um das Spiel X3: Terran Conflict von EGOSOFT. In diesem Spiel sind die Sprachdateien in einzelnen .xml Dateien. Nachdem ich nun eine Mod installierte habe, wurden einige originale SprachIDs überschrieben und somit sind diese auf Englisch.
Nicht so schlimm, aber ich hatte keine Lust jede ID einzeln abzugleichen und anzupassen.

Deswegen wollte ich mir ein kleines Java Programm schreiben, dass das für mich automatisch macht. Man ruft es mit zwei .xml Dateien auf. Einmal mit der originalen deutschen Textdatei und einmal mit der englischen.
Java:
/* Uebersetzen.java */

import java.io.*;
import read.*;

public class Uebersetzen
{
	public static void main (String[] args)
	{
		String zeile, zeile2;
		String[] zeileArr = {}, zeile2Arr = {};
		FileReader freader1, freader2;
		int i = 1;
		
		try
		{
			if (args.length == 0)
			{
				System.out.print("Waehle die 1. Datei: ");
				freader1 = new FileReader(Read.getString());
				System.out.print("Waehle die 2. Datei: ");
				freader2 = new FileReader(Read.getString());
			}
			else
			{
				freader1 = new FileReader(args[0]);
				freader2 = new FileReader(args[1]);
			}
				
			BufferedReader reader1 = new BufferedReader(freader1);
			BufferedReader reader2 = new BufferedReader(freader2);
			BufferedWriter writer  = new BufferedWriter(new FileWriter("0001-test.txt"));
			
			while ((zeile = reader1.readLine()) != null && (zeile2 = reader2.readLine()) != null)
			{
				i++;	// Anzahl der Zeilen
				if (zeile.indexOf("<t id=") != -1 && zeile2.indexOf("<t id=") != -1)	// Überprüft, ob die Zeile eine ID Zeile ist: <t id="1020101">Königstal</t>
				{
					System.out.print("I: " + i);
					zeileArr = zeile.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
					zeileArr = zeileArr[1].split(">");		// Ergebnis: "1020101"
					zeile2Arr = zeile2.split("<t id=");
					zeile2Arr = zeile2Arr[1].split(">");
					
					if (zeileArr[0].equals(zeile2Arr[0]))	// Wenn die ID die Gleiche ist, dann verwende die Zeile der deutschen Textdatei
					{
						System.out.println("ID " + zeileArr[0] + " wird ueberschrieben.");
						writer.write(zeile + "\n");
					}
					else	// Ansonsten schreibe die Zeile der 2. Textdatei in die neue Datei
					{
						System.out.println(" Wird geschrieben");
						writer.write(zeile2 + "\n");
					}
				}
				else
				{
					writer.write(zeile2 + "\n");	// Wenn die Zeile keine ID Zeile ist, dann schreibe die Zeile der 2. Textdatei in die neue Datei
				}
			}
			System.out.println("Fertig\t" + i + " Zeilen");
		}
		
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
Mein Programm funktioniert auch soweit. Aber bei meinen Versuchen wurde meine Datei, die geschrieben werden soll, niemals richtig angelegt.

1. Versuch:
- Originale Textdatei: 3.286.981 chars, 3.382.258 bytes, 32.870 Zeilen
- Textdatei der Mod: 87.415 chars, 91.123 bytes, 1.851 Zeilen
- Erstellte Textdatei: 72.179 chars, 73.728 bytes, 1.542 Zeilen

Wo ist hier mein Fehler? Lasse ich mir alle Zeilen in der Konsole ausgeben, dann funktioniert es ohne Probleme. Das Komische ist auch, dass der Writer mitten in der Zeile aufgehört hat:
Code:
Zeile 1542 erstellte Datei: <t id="1030810">1168883974,159096
Zeile 1542 Textdatei der Mod: <t id="1030810">1168883974,159096056,1304177310;1307958391,158154743,-1162817375;1280258039,339520687,1156103350</t>

2. Versuch:
- Originale Textdatei: 3.286.981 chars, 3.382.258 bytes, 32.870 Zeilen
- Textdatei der Mod: 6.246 chars, 6.648 bytes, 202 Zeilen
- erstellte Datei: 0 chars, 0 bytes, 0 Zeilen


Kann ein BufferedWriter nicht so viele Strings/Chars schreiben?
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Versuch mal nach dem Schreiben flush() aufzurufen oder noch besser den Stream zu schließen.
Außerdem vergleichst du zeilenweise. Es steht ja nicht fest, dass in Zeile 20 von Datei A genau die selbe ID übersetzt wird, wie in Zeile 20 Datei B. Da musst du noch etwas am Algo schrauben.
 

Zertos

Mitglied
Danke durch das Löschen des Puffers des Writers (flush()) werden die Dateien jetzt richtig angelegt. :)
Wie könnte ich den Algorithmus verbessern? Aus der 1. Datei nur eine ID nehmen und die zweite Datei komplett durchlaufen lassen und überprüfen, ob die ID dort vorkommt? Und das mit allen weiteren?
 

XHelp

Top Contributor
Geeignete Darstellung für deine Daten machen, 2 Dateien einmalig einlesen und mit den Werten dann tun und lassen was du willst.
(bis hin zu: equals passend überschreiben und beide Datenmengen in ein Set packen)
 

Zertos

Mitglied
Ich hab mir jetzt überlegt die Zeilen jeweils in einem Array / Stringlist pro Datei zu speichern und dann die Arrayelemente auf gleiche ID überprüfen. Der Vergleich würde dann wie oben ablaufen. ID #1 aus Array #1 wird mit allen Elementen im Array #2 verglichen.
Sinnvoll oder nicht? :)
 

Zertos

Mitglied
Nochmals danke :)
Eine HashMap ist ja ähnlich wie ein Array, das ist schon mal gut :)

Habe jetzt vor gehabt eine HashMap zu erstellen und in diese schreibe ich die Zeilen aus der englischen Textdatei. Dann lese ich die originale Datei ein und bei ID Zeilen überprüfe ich, ob die ID in der Hashmap vorkommt. Falls ja, wird dieser Eintrag überschrieben.
Am Ende wird die HashMap dann die neue Datei. :)

Soweit so gut, nur bin ich da auf einen kleinen Fehler gestoßen.
Meine HashMap soll aus einem Number Key und einem String Value bestehen.
Der Key enthält entweder die Zeilennummer, falls es keine ID Zeile ist oder die ID.
Java:
HashMap<Number, String> zeilen = new HashMap<Number, String>();

Als Test hab ich mal diese Zeile in die While Schleife geschrieben:
Java:
zeilen.put(i, zeile);
i ist ja vom Typ int und Zeile vom Typ String.
Funktioniert auch, sowie es soll :)

Das Problem ist jetzt, dass die ID, die ich bekomme sozusagen ein String in einem String ist: ""1020101"".
Und damit funktioniert keine Typumwandlung per Integer.parseInt(); Wie bekomme ich also die überflüssigen " " weg? Habe schon gegoogelt, aber ich finde dazu nichts. :(
EDIT: Hab doch eine Lösung für dieses Problem gefunden. Die Lösung liegt bei der .substring() Methode der String Klasse :)
Java:
id = zeileArr[0].substring(1, zeileArr[0].length()-1);
=> String (Java 2 Platform SE v1.4.2)
 
Zuletzt bearbeitet:
G

Gastredner

Gast
Wäre es nicht vielleicht einfacher, würdest du die XML-Dateien auch XML-gerecht verarbeiten und nicht über Reader/Writer?
Du könntest z. B. JDOM nutzen, das fand ich immer sehr angenehm zu benutzen. Du würdest dann aus beiden Dateien ein Document erzeugen. Vom Root-Element ausgehend könntest du dann das englische oder deutsche Document durchlaufen und die Inhalte der Elemente mit der gleichen ID austauschen. Anschließend das bearbeitete Document wieder hinausschreiben.
Könntest du mal einen Ausschnitt aus den XML-Dateien posten? Wenn die Text-Elemente alle in der gleichen Ebene liegen ist das ja wirklich einfach. Bei tiefer verschachtelten Elementen sollte das aber auch kein Beinbruch sein.
Die grundlegenden Aktionen mit JDOM sind auf Wikipedia kurz aufgezeigt: JDOM - Wikipedia, the free encyclopedia

Falls du bei deiner Methode bleiben willst: String bietet die Methode replace(char, char), mit der du die Anführungszeichen entfernen kannst: [c]input.replace('\"', '');[/c].
 
Zuletzt bearbeitet von einem Moderator:

Zertos

Mitglied
Wäre es nicht vielleicht einfacher, würdest du die XML-Dateien auch XML-gerecht verarbeiten und nicht über Reader/Writer?
Du könntest z. B. JDOM nutzen, das fand ich immer sehr angenehm zu benutzen. Du würdest dann aus beiden Dateien ein Document erzeugen. Vom Root-Element ausgehend könntest du dann das englische oder deutsche Document durchlaufen und die Inhalte der Elemente mit der gleichen ID austauschen. Anschließend das bearbeitete Document wieder hinausschreiben.
Könntest du mal einen Ausschnitt aus den XML-Dateien posten? Wenn die Text-Elemente alle in der gleichen Ebene liegen ist das ja wirklich einfach. Bei tiefer verschachtelten Elementen sollte das aber auch kein Beinbruch sein.
Die grundlegenden Aktionen mit JDOM sind auf Wikipedia kurz aufgezeigt: JDOM - Wikipedia, the free encyclopedia
Ausschnitt aus der XML Datei:
[XML]<?xml version="1.0" encoding="utf-8" ?>
<language id="49">
<page id="7" title="Boardcomp. Sectornames" descr="Names of all sectors (spoken by Boardcomputer)" voice="yes">
<t id="1020000">Unbekannter Sektor</t>
<t id="1020101">Königstal</t>
<t id="1020102">Rolks Reich</t>
<t id="1020103">Königinhügel</t>
<t id="1020104">Menelaus' Grenze</t>
...
<t id="5002">{param@Option2}: {param@Price2}</t>
<t id="5003">{param@Option3}: {param@Price3}</t>
<t id="5004">{param@Option4}: {param@Price4}</t>
<t id="5005">{param@Option5}: {param@Price5}</t>
<t id="5006">{param@Option6}: {param@Price6}</t>
</page>
</language>[/XML]

In den Moddateien stehen noch ein paar Kommentare, aber sonst ist der Aufbau der Selbe :)

Falls du bei deiner Methode bleiben willst: String bietet die Methode replace(char, char), mit der du die Anführungszeichen entfernen kannst: [c]input.replace('\"', '');[/c].
Geht auch mit:
Java:
id = zeileArr[0].substring(1, zeileArr[0].length()-1);
Aber danke, jetzt weiß ich wie ich die Anführungszeichen auch wegbekommen würde :)
 
G

Gastredner

Gast
Ausschnitt aus der XML Datei:
[XML]<?xml version="1.0" encoding="utf-8" ?>
<language id="49">
<page id="7" title="Boardcomp. Sectornames" descr="Names of all sectors (spoken by Boardcomputer)" voice="yes">
<t id="1020000">Unbekannter Sektor</t>
<t id="1020101">Königstal</t>
<t id="1020102">Rolks Reich</t>
<t id="1020103">Königinhügel</t>
<t id="1020104">Menelaus' Grenze</t>
...
<t id="5002">{param@Option2}: {param@Price2}</t>
<t id="5003">{param@Option3}: {param@Price3}</t>
<t id="5004">{param@Option4}: {param@Price4}</t>
<t id="5005">{param@Option5}: {param@Price5}</t>
<t id="5006">{param@Option6}: {param@Price6}</t>
</page>
</language>[/XML]
Naja, der Aufbau ist ja ziemlich einfach:
Java:
package x3xml;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class X3XMLReader {

	public static void main(String[] args) throws JDOMException, IOException {
		File ger = new File("test-ger.xml");
		File eng = new File("test-eng.xml");
		exchange(ger, eng);
	}

	@SuppressWarnings("unchecked")
	public static void exchange(File ger, File eng) throws JDOMException, IOException {
		SAXBuilder builder = new SAXBuilder();
		Document gerDocument = builder.build(ger);
		Document engDocument = builder.build(eng);
		List<Element> textGer = gerDocument.getRootElement().getChild("page").getChildren("t");
		List<Element> textEng = engDocument.getRootElement().getChild("page").getChildren("t");
		for (Element e: textGer) {
			Element engElement = findByID(e.getAttributeValue("id"), textEng);
			if (engElement != null) {
				engElement.setText(e.getText());
			}
		}
		FileWriter fw = new FileWriter(eng);
		XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
		out.output(engDocument, fw);
		fw.close();
	}

	public static Element findByID(String id, List<Element> elements) {
		for (Element e: elements) {
			if (e.getAttributeValue("id").equals(id)) {
				return e;
			}
		}
		return null;
	}
}
Sicherlich nicht die beste Lösung, aber eine mögliche. Alle Eintragungen in der englischen Datei, die ein entsprechendes Gegenstück in der deutschen Datei haben, werden ausgetauscht. Korrekt so?
 

Zertos

Mitglied
Danke. Ist wirklich deutlich einfacher :) Ich will aber noch versuchen mein Programm fertig zu bekommen. Ist ja auch gleich mit eine Übung :) Dann gibt es eine Variante ohne zusätzliche Bibliothek und eine mit ;D

Kann das sein, dass die Methode [c]hashMap.put(key, value)[/c] die Werte nicht hintereinander listet?
Hab das Programm mal so umgeschrieben, um es mal per HashMap auszuprobieren und die Datei erstmal nur zu kopieren ohne Austausch:
Java:
/* Uebersetzen.java */

import java.io.*;
import java.util.*;
import read.*;

public class Uebersetzen
{
	public static void main (String[] args)
	{
		String zeile, zeile2;
		String[] zeileArr = {}, zeile2Arr = {};
		FileReader freader1, freader2;
		int i = 0, id, id2;
		HashMap<Number, String> zeilen = new HashMap<Number, String>();
		
		try
		{
			if (args.length == 0)
			{
				System.out.print("Waehle die 1. Datei: ");
				freader1 = new FileReader(Read.getString());
				System.out.print("Waehle die 2. Datei: ");
				freader2 = new FileReader(Read.getString());
			}
			else
			{
				freader1 = new FileReader(args[0]);
				freader2 = new FileReader(args[1]);
			}
				
			BufferedReader reader1 = new BufferedReader(freader1);
			BufferedReader reader2 = new BufferedReader(freader2);
			BufferedWriter writer  = new BufferedWriter(new FileWriter("0001-test.txt"));
			
			// Einlesen der 2. Datei und speichern in HashMap
			while ((zeile2 = reader2.readLine()) != null)
			{
				i++;
				if (zeile2.indexOf("<t id=") != -1)
				{
					zeile2Arr = zeile2.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
					zeile2Arr = zeile2Arr[1].split(">");	// Ergebnis: "1020101" + Königstal</t>
					id = Integer.parseInt(zeile2Arr[0].replace('\"', ' ').trim());		// Ergebnis: "1020101" => 1020101
					zeilen.put(id, zeile2 + "\n");
				}
				else
				{
					zeilen.put(i + 50000000, zeile2 + "\n");
				}				
			}
			for (String elem : zeilen.values())
			{
				writer.write(elem);
				writer.flush();
			}
		}		
		
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

Es wird in der richtigen Reihenfolge eingelesen, aber in der komplett falschen Reihenfolge wieder ausgegeben:
[XML] <t id="1021617">300</t>
<t id="1">The X-Tended - Terran Conflict Mod</t>
<t id="1021616">300</t>
<t id="2">X-Tended - Terran Conflict</t>
<t id="1021619">100</t>
<t id="3">XTC</t>
<t id="1021618">150</t>
<!-- XTC Version Data (7210-7220) -->
<t id="4">The XTC Team</t>
<!-- <t id="1021621">20 / 15</t> -->
<page id="7212" title="XTC" descr="XTC Framework Texts">
<!-- <t id="1021620">19 / 15</t> -->
</page>
<t id="6">\nWelcome to X-Tended - Terran Conflict.\n\nWe recommend that you take a bit of time to set up your hotkeys, look into the Galactic News System, and adjust the difficulty in your Configuration Menu.\nLook at your reputation while you're there, check your property list in the statistics centre - see if this gamestart suits you fine.\n\nAnd, of course, don't forget that many things have changed - including the universe itself. One of the principles of XTC is exploration - so on you go.\n\nDon't forget about your family!</t>
<!-- <t id="1021623">22 / 15</t> -->
<!-- <t id="1021622">21 / 15</t> -->
</language>
<!-- <t id="1021624">23 / 15</t> -->
</page>
<t id="13">\n</t>
<!-- <t id="1021601">00 / 15</t> -->
<!-- <t id="1021602">01 / 15</t> -->
<!-- <t id="1021603">02 / 15</t> -->
<t id="21">.</t><!-- delimiter, decimal 3.14 -->[/XML]

Wieso das denn? :(
 
Zuletzt bearbeitet:

Zertos

Mitglied
Danke mit der LinkedHashMap sind die Werte nun in der richtigen Reihenfolge. :)
Dein Beispiel funktioniert bei mir übrigens leider nicht. Ich glaub ich die hab DOM falsch installiert :(

Gibt aber noch ein kleines Problem. Habe festgestellt, dass die Text IDs jeweils von der oberen page ID abhängen. Bin gerade dabei die Werte nur pro page ID einzulesen und zu ersetzen. Ich glaube ich erstelle hier eine weitere temporäre LinkedHashMap in der nur die aktuellen Text IDs einer page ID drinnen stehen. Suche gerade nach einer Möglichkeit nur diesen einen Abschnitt zu bekommen :] Aber ich denke ich hab da schon eine Idee.

Wie kann ich eigentlich die Kodierung verändern? Die erstellte Datei sollte im UTF-8 kodiert werden, ansonsten werden die Umlaute usw. falsch angezeigt :)
 
G

Gastredner

Gast
Danke mit der LinkedHashMap sind die Werte nun in der richtigen Reihenfolge. :)
Dein Beispiel funktioniert bei mir übrigens leider nicht. Ich glaub ich die hab DOM falsch installiert :(
Nutzt du Eclipse? Ich lege mir immer einen Ordner namens "lib" im Projektverzeichnis an. In diesen kommen benötigte Bibliotheken, die anschließend über Rechtsklick->Build Path->Add to Build Path dem Build Path hinzugefügt werden und damit verfügbar sind.

Gibt aber noch ein kleines Problem. Habe festgestellt, dass die Text IDs jeweils von der oberen page ID abhängen. Bin gerade dabei die Werte nur pro page ID einzulesen und zu ersetzen. Ich glaube ich erstelle hier eine weitere temporäre LinkedHashMap in der nur die aktuellen Text IDs einer page ID drinnen stehen. Suche gerade nach einer Möglichkeit nur diesen einen Abschnitt zu bekommen :] Aber ich denke ich hab da schon eine Idee.
Gibt es mehr als nur eine Page in jeder Datei? Dann müsste man auch die JDOM-Lösung anpassen...

Wie kann ich eigentlich die Kodierung verändern? Die erstellte Datei sollte im UTF-8 kodiert werden, ansonsten werden die Umlaute usw. falsch angezeigt :)
Nimm einen OutputStreamWriter und übergib ihm als String-Argument "UTF-8". Den OutputStreamWriter kannst du anschließend deinem bevorzugten Writer, z. B. einem BufferedWriter, als zu verwendenden Stream übergeben.
 

Zertos

Mitglied
Nutzt du Eclipse? Ich lege mir immer einen Ordner namens "lib" im Projektverzeichnis an. In diesen kommen benötigte Bibliotheken, die anschließend über Rechtsklick->Build Path->Add to Build Path dem Build Path hinzugefügt werden und damit verfügbar sind.
Bis jetzt nutze ich nur Notepad++ und die Konsole. Habe zwar Eclipse installiert, aber bis jetzt nicht benutzt :)


Gibt es mehr als nur eine Page in jeder Datei? Dann müsste man auch die JDOM-Lösung anpassen...
Ja, es können mehrere Pages in einer Datei vorkommen.
Kleiner Ausschnitt:
[XML]<?xml version="1.0" encoding="utf-8" ?>
<language id="49">
<page id="12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
<t id="100">α</t>
<t id="101">β</t>
<t id="102">γ</t>
<t id="103">δ</t>
<t id="104">ε</t>
<t id="105">ζ</t>
<t id="106">η</t>
<t id="107">θ</t>
<t id="108">ι</t>
<t id="109">κ</t>
<t id="110">λ</t>
<t id="111">μ</t>
<t id="112">ν</t>
<t id="113">ξ</t>
<t id="114">ο</t>
<t id="115">π</t>
<t id="116">ρ</t>
<t id="117">σ</t>
<t id="118">τ</t>
<t id="119">υ</t>
<t id="120">φ</t>
<t id="121">χ</t>
<t id="122">ψ</t>
<t id="123">ω</t>
<t id="124">ω</t>
</page>
<page id="17" title="Boardcomp. objects" descr="" voice="yes">
<t id="2051">Kristallfabrik</t>
<t id="2061">Quantum Tube Factory</t>
<t id="2251">BoGas Factory</t>[/XML]


Nimm einen OutputStreamWriter und übergib ihm als String-Argument "UTF-8". Den OutputStreamWriter kannst du anschließend deinem bevorzugten Writer, z. B. einem BufferedWriter, als zu verwendenden Stream übergeben.
Danke, mein Writer schaut nun so aus:
Java:
BufferedWriter writer  = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("0001-test.txt"),"UTF-8"));
. Leider werden mir die griechischen Buchstaben (s. o.) nicht mehr richtig dargestellt. :(


Habe jetzt mal mein Programm angepasst, damit auch die Pages funktionieren. Nun ja ... klappt nicht so wie ich will. Ich bekomme immer eine NullPoiinterException in Zeile 47. Hier mal mein neuer Code:
Java:
/* Uebersetzen.java */

import java.io.*;
import java.util.*;
import read.*;

public class Uebersetzen
{
	public static void main (String[] args)
	{
		String zeile, zeile2;
		String[] zeileArr = {}, zeile2Arr = {};
		FileReader freader1, freader2;
		int i = 0, id, id2, pid = 0, pid2 = 0;
		LinkedHashMap<Number, String> zeilen = new LinkedHashMap<Number, String>();
		LinkedHashMap<Number, String> pageblock = new LinkedHashMap<Number, String>();
		
		try
		{
			if (args.length == 0)
			{
				System.out.print("Waehle die 1. Datei: ");
				freader1 = new FileReader(Read.getString());
				System.out.print("Waehle die 2. Datei: ");
				freader2 = new FileReader(Read.getString());
			}
			else
			{
				freader1 = new FileReader(args[0]);
				freader2 = new FileReader(args[1]);
			}
				
			BufferedReader reader1 = new BufferedReader(freader1);
			BufferedReader reader2 = new BufferedReader(freader2);
			BufferedWriter writer  = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("0001-test.txt"),"UTF-8"));
			
			// Einlesen der englischen Datei und speichern in HashMap
			while ((zeile2 = reader2.readLine()) != null)
			{
				i++;
				if (zeile2.indexOf("<page id=") != -1)		// Überprüft, ob eine Zeile eine page Zeile ist: <page id="12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
				{
					pageblock.put(i + 5000000, zeile2);		// Pagezeile der temporären HashMap pageblock hinzufügen
					zeile2Arr = zeile2.split("<page id=");	// Ergebnis: "12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
					zeile2Arr = zeile2Arr[1].split(" ");	// Ergebnis: "12" + title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
					pid2 = Integer.parseInt(zeile2Arr[0].replace('\"', ' ').trim());	// Ergebnis: "12" => 12 (Integer)
					while (((zeile2 = reader2.readLine()).compareTo("</page") != -1) && (zeile2 != null))	// Erfasse den ganzen Page Block
					{
						if (zeile2.indexOf("<t id=") != -1)	// Überprüft, ob die Zeile eine ID Zeile ist: <t id="1020101">Königstal</t>
						{
							zeile2Arr = zeile2.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
							zeile2Arr = zeile2Arr[1].split(">");	// Ergebnis: "1020101" + Königstal</t>
							id = Integer.parseInt(zeile2Arr[0].replace('\"', ' ').trim());		// Ergebnis: "1020101" => 1020101 (Integer)
							pageblock.put(id, zeile2 + "\n");	// Füge dem pageblock jede ID Zeile hinzu
						}
					}
					// Einlesen der originalen Datei und Vergleich der IDs
					while (((zeile = reader1.readLine()).compareTo("</page") != -1) && (zeile != null))	// Erfasse den ganzen Page Block
					{
						if (zeile.indexOf("<t id=") != -1)	// Überprüft, ob die Zeile eine ID Zeile ist: <t id="1020101">Königstal</t>
						{
							zeileArr = zeile.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
							zeileArr = zeileArr[1].split(">");		// Ergebnis: "1020101" + Königstal</t>
							id = Integer.parseInt(zeileArr[0].replace('\"', ' ').trim());		// Ergebnis: "1020101" => 1020101
							if (pageblock.containsKey(id))
							{
								pageblock.put(id, zeile);
							}
						}
					}
					System.out.println(pageblock.toString());
					zeilen.putAll(pageblock);		// Kompletter pageblock wird der zeilen HashMap hinzugefügt
					pageblock.clear();				// pageblock wird geleert
				}
				else
				{
					zeilen.put(i + 5000000, zeile2 + "\n");
				}
			}
			
			for (String elem : zeilen.values())
			{
				writer.write(elem);
				writer.flush();
			}
	
		}
	
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
 

Zertos

Mitglied
So, mein Programm ist nun fertig und ersetzt jeweils nur die IDs, wenn auch die page ID gleich ist:
Java:
/* Uebersetzen.java */

package uebersetzen;

import java.io.*;
import java.util.*;
import read.*;

public class Uebersetzen
{
	public static void main(String[] args)
	{
		String zeile, zeile2;
		String[] zeileArr = {}, zeile2Arr = {};
		FileReader freader1, freader2;
		int i = 0, id, id2, pid = 0, pid2 = 0;
		LinkedHashMap<Number, String> zeilen = new LinkedHashMap<Number, String>();	// LinkedHashMaps behalten die Reihenfolge bei, in der man die
		LinkedHashMap<Number, String> pageblock = new LinkedHashMap<Number, String>();	// Werte in die HashMap schreibt
		
		try
		{
			if (args.length == 0)	// Wenn keine Argumente an das Programm übergeben wurden,
			{						// dann frage den Benutzer, welche Dateien er verwenden möchte
				System.out.print("Waehle die 1. Datei (originale deutsche): ");
				freader1 = new FileReader(Read.getString());
				System.out.print("Waehle die 2. Datei (modifzierte englische): ");
				freader2 = new FileReader(Read.getString());
			}
			else	// ansonsten nimm die übergebenen Argumente als Dateien
			{
				freader1 = new FileReader(args[0]);
				freader2 = new FileReader(args[1]);
			}
				
			BufferedReader reader1 = new BufferedReader(freader1);
			BufferedReader reader2 = new BufferedReader(freader2);
			BufferedWriter writer  = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("0001-test.xml"),"UTF-8"));
			
			// Einlesen der englischen Datei und speichern in HashMap
			while ((zeile2 = reader2.readLine()) != null)
			{
				i++;
				if (zeile2.indexOf("<page id=") != -1)		// Überprüft, ob eine Zeile eine page Zeile ist: <page id="12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
				{
					pageblock.put(i + 5000000, zeile2);		// Pagezeile der temporären HashMap pageblock hinzufügen
					zeile2Arr = zeile2.split("<page id=");	// Ergebnis: "12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
					zeile2Arr = zeile2Arr[1].split(" ");	// Ergebnis: "12" + title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
					pid2 = Integer.parseInt(zeile2Arr[0].replace('\"', ' ').trim());	// Ergebnis: "12" => 12 (Integer)
					while (zeile2.indexOf("</page") == -1)	// Erfasse den ganzen Page Block
					{
						zeile2 = reader2.readLine();
						if (zeile2.indexOf("<t id=") != -1)	// Überprüft, ob die Zeile eine ID Zeile ist: <t id="1020101">Königstal</t>
						{
							zeile2Arr = zeile2.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
							zeile2Arr = zeile2Arr[1].split(">");	// Ergebnis: "1020101" + Königstal</t>
							id2 = Integer.parseInt(zeile2Arr[0].replace('\"', ' ').trim());		// Ergebnis: "1020101" => 1020101 (Integer)
							pageblock.put(id2, zeile2 + "\n");	// Füge dem pageblock jede ID Zeile hinzu
						}
					}
					// Einlesen der originalen Datei und Vergleich der IDs
					while ((zeile = reader1.readLine()) != null)
					{
						if (zeile.indexOf("<page id=") != -1)
						{
							zeileArr = zeile.split("<page id=");	// Ergebnis: "12" title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
							zeileArr = zeileArr[1].split(" ");	// Ergebnis: "12" + title="Boardcomp. greek" descr="Spoken greek letters" voice="yes">
							pid = Integer.parseInt(zeileArr[0].replace('\"', ' ').trim());	// Ergebnis: "12" => 12 (Integer)
							
							if (pid == pid2)	// Überprüfen, ob die page ID in der englischen Textdatei auftaucht
							{
								System.out.println("page IDs (" + pid + ") sind gleich");
								while (zeile.indexOf("</page") == -1)	// Schleife läuft solange durch bis das Ende des page Abschnitts gefunden wurde
								{
									zeile = reader1.readLine();	// nächste Zeile einlesen
									if (zeile.indexOf("<t id=") != -1)	// Überprüft, ob die Zeile eine ID Zeile ist: <t id="1020101">Königstal</t>
									{
										zeileArr = zeile.split("<t id=");		// Ergebnis: "1020101">Königstal</t>
										zeileArr = zeileArr[1].split(">");		// Ergebnis: "1020101" + Königstal</t>
										id = Integer.parseInt(zeileArr[0].replace('\"', ' ').trim());		// Ergebnis: "1020101" => 1020101
										if (pageblock.containsKey(id))	// Überprüfen, ob ID in der englischen Textdatei auftaucht
										{
											System.out.println(id + " ist enthalten");
											pageblock.put(id, zeile + "\n");	// Falls ja, dann überschreiben
										}
									}
								}
								break;	// Wenn der pageblock ersetzt wurde, dann breche die Schleife ab
							}
						}
					}
					zeilen.putAll(pageblock);		// Kompletter pageblock wird der zeilen HashMap hinzugefügt
					pageblock.clear();				// pageblock wird geleert
				}
				else
				{
					zeilen.put(i + 5000000, zeile2 + "\n");
				}
			}
			
			for (String elem : zeilen.values())	// Schreiben in die Datei
			{
				writer.write(elem);
				writer.flush();
			}
		
		}
	
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

Nur ein Problem habe ich noch:
Die Umlaute werden immer noch falsch angezeigt, obwohl ich doch die UTF-8 Kodierung angegeben habe :(
 

Zertos

Mitglied
Ist ja logisch, dass es nicht funktioniert hat :)
Die geschriebene Datei ist zwar in UTF-8 kodiert, aber die anderen beiden Dateien muss ich ja auch noch in UTF-8 einlesen:
Java:
if (args.length == 0)	// Wenn keine Argumente an das Programm übergeben wurden,
{						// dann frage den Benutzer, welche Dateien er verwenden möchte
	System.out.print("Waehle die 1. Datei (originale deutsche): ");
	ireader1 = new InputStreamReader(new FileInputStream(Read.getString()), "UTF-8");
	System.out.print("Waehle die 2. Datei (modifzierte englische): ");
	ireader2 = new InputStreamReader(new FileInputStream(Read.getString()), "UTF-8");
}
else	// ansonsten nimm die übergebenen Argumente als Dateien
{
	ireader1 = new InputStreamReader(new FileInputStream(args[0]), "UTF-8");
	ireader2 = new InputStreamReader(new FileInputStream(args[1]), "UTF-8");
}			
BufferedReader reader1 = new BufferedReader(ireader1);
BufferedReader reader2 = new BufferedReader(ireader2);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
W Vergleich von DatenPaketen Java Basics - Anfänger-Themen 6
B String vergleich Java Basics - Anfänger-Themen 3
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
V Fließkommazahlen Vergleich Java Basics - Anfänger-Themen 7
J Vergleich Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
T Vergleich und Ausgabe von Zahlen Java Basics - Anfänger-Themen 1
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
J Fehler bei Vergleich auf den grössten Wert Java Basics - Anfänger-Themen 2
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
T Input/Output String-Vergleich schlägt fehl Java Basics - Anfänger-Themen 7
W Konvertierung und Vergleich unterschiedlicher Zeitformate Java Basics - Anfänger-Themen 11
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L PW-Vergleich Java Basics - Anfänger-Themen 5
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
S Vergleich von Listen Java Basics - Anfänger-Themen 6
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
V Einfacher vergleich von Arrays geht schief Java Basics - Anfänger-Themen 2
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
N Methoden Array vergleich funzt nicht Java Basics - Anfänger-Themen 8
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
S Vergleichsmethode zum Objekt-Vergleich mit < und > Java Basics - Anfänger-Themen 4
F Problem bei Vergleich Java Basics - Anfänger-Themen 3
S File vergleich - Junit Java Basics - Anfänger-Themen 6
P String-Vergleich Java Basics - Anfänger-Themen 3
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
R String-Vergleich Java Basics - Anfänger-Themen 15
C Variablen Vergleich funktioniert nicht Java Basics - Anfänger-Themen 11
J Erste Schritte Vergleich der String-Objekte Java Basics - Anfänger-Themen 17
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
A Variablen Vergleich Java Basics - Anfänger-Themen 5
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
G Date - Calender | "Vergleich" Java Basics - Anfänger-Themen 3
M Vergleich mit Toleranz Java Basics - Anfänger-Themen 7
B Objekt Vergleich - Unterschiede ausgeben Java Basics - Anfänger-Themen 4
P Vergleich mit Variablen Java Basics - Anfänger-Themen 6
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
K Vergleich von variable und array Java Basics - Anfänger-Themen 9
L vergleich zweier texte Java Basics - Anfänger-Themen 18
H Beim Vergleich/Sortieren mehr als zwei Objekte berücksichtigen Java Basics - Anfänger-Themen 14
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
P Vergleich von Enums Java Basics - Anfänger-Themen 4
S String Vergleich funktioniert nicht Java Basics - Anfänger-Themen 3
A String-Vergleich geht nicht Java Basics - Anfänger-Themen 2
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
F Methoden Vergleich von int Zahlen Java Basics - Anfänger-Themen 16
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
N Vergleich per equals Java Basics - Anfänger-Themen 5
S Herunterladen von Dateien mit Vergleich Java Basics - Anfänger-Themen 6
L Problem String-Vergleich Java Basics - Anfänger-Themen 2
E Objekte-Vergleich Java Basics - Anfänger-Themen 6
Y Datentypen String vergleich Java Basics - Anfänger-Themen 3
R Vergleich von Objekten anhand variierender Kriterien Java Basics - Anfänger-Themen 5
K Datentypen Arrays in Java - Adress-Arithmetik im Vergleich zu Listen Java Basics - Anfänger-Themen 4
S equals vergleich Java Basics - Anfänger-Themen 10
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
M Char vergleich zu Int Java Basics - Anfänger-Themen 10
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
algorismi Ausführungszeit Vergleich == true Java Basics - Anfänger-Themen 8
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
T Zwei listen vergleich und selbige löschen Java Basics - Anfänger-Themen 4
T Vergleich mit Typecasts Java Basics - Anfänger-Themen 3
Screen Eine Frage zu moueMove in applets und deren Vergleich Java Basics - Anfänger-Themen 11
M Vergleich Float-, Doublewert Java Basics - Anfänger-Themen 10
G Vergleich zweier Arrays Java Basics - Anfänger-Themen 8
U Methode Vergleich von 2 Arrays Java Basics - Anfänger-Themen 5
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
G Vergleich klappt nicht Java Basics - Anfänger-Themen 3
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
C DB Vergleich mit Eingabe Java Basics - Anfänger-Themen 5
G Vergleich großer Basen/Exponenten? Java Basics - Anfänger-Themen 3
F Vergleich von Objekten Java Basics - Anfänger-Themen 2
N Vergleich findet nicht statt. Java Basics - Anfänger-Themen 13
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
A Vergleich schlägt fehl Java Basics - Anfänger-Themen 15
G Vergleich bei MD5-Verschlüsselung Java Basics - Anfänger-Themen 3
R +1 Vergleich Java Basics - Anfänger-Themen 3
E Char vergleich Java Basics - Anfänger-Themen 7
loadbrain Array vergleich mit 2 for schleifen Java Basics - Anfänger-Themen 6
D Vergleich von ListenElementen Java Basics - Anfänger-Themen 2
M Problem bei einem Vergleich Java Basics - Anfänger-Themen 6
G Vergleich Eingabe mit Wert in vorhandenem Array Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben