Datenkonvertierung

B

BastianSeb

Gast
Hallo zusammen

Ich bin derzeit damit beschäftigt mir eine Programm zu schreiben mit dem ich ein Textformat in ein anderes umwandeln kann. Ich habe ähnlich Sachen im Bezug auf XML Anwendungen zwar gefunden, jedoch leider ist meine Eingabedatei kein XML-File und ich kann somit die dort verwendeten Bibliotheken nicht verwenden.

Bisher bin ich soweit das ich ein Text-File einlesen kann,dieses mir Zeilenweise per BufferReader herauslese und dann die Inhalte via StringTokenizer in seine Bestandteile zerlege und auch ausgebe.
Hier tauchen meine ersten beiden Problem auf.

1. Es wird so lang Zeilenweise ausgelesen, bis eine Leerzeile kommt.
Das würde ich eher abwandeln wollen in: Es wird solange ausgelesen, bis "End" im Textdokument kommt

2. Leider muss ich bisher wissen wie viele Einträge pro spalte stehen und was dieser für mich bedeutet.

Bsp.: Inputfile:
Tag 1 Sport Weitsprung Name Hannes Bewertung 5 Anmerkung (keine/ sozusagen "null") Vertretung (keine)
Name Johannes Bewertung 2,3
Name Hans Bewertung 3 Anmerkung Armbruch
Sport Hochsprung Name Hannes Bewertung 5 Anmerkung (keine/ sozusagen "null") Vertretung (keine)
Name Johannes Bewertung 2,3 Vertretung (keine)
Name Hans Bewertung 3 Anmerkung Armbruch
Tag 2 Sport Schwimmen .... wie Tag 1 nur die Einträge sind wieder unterschiedlich.

Ich habe als eindeutige Definitionen innerhalb des "segmente (Tag)" wie Sport, Name, Anmerkung, Bewertung ... Leider sind diese pro Zeile aber nicht sortiert. Fest ist die Bezeichnung und das nach einem " " der dazugehörige wert kommt.
Ich müsste mir eine Art Filter schreiben der nach den jeweiligen begriffen suchen kann. Ich hab aber ka wie und ob das überhaupt funktioniert.

Warum das Ganze. Wie geschrieben möchte ich das in ein Neues Textdokument übergeben. Genau genommen soll das eine SQL datei werden mit denen ich die Daten in die DB einbinden kann.
Das Schema dieser SQL würde ich vorfertigen und die entsprechenden Werte aus der Text-File nur noch hinzufügen. (Hier werden bestimmt wieder neue Fragen von mir kommen aber damit will ich euch noch nicht belasten und auch sehen wie weit ich wieder alleine komme.)


Mein Quelltext:
Java:
package streams;

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class DateiLeseTest extends JFrame implements ActionListener
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	File file;

	public DateiLeseTest(String title)
	{
		super(title);
		addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		
		JButton loadfile = new JButton("Datei laden");
		JButton safefile = new JButton("Datei speichern");
		
		this.setSize(new Dimension(800,600));
		Dimension Bild = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((Bild.width-800)/2,(Bild.height-600)/2);
		
		this.setTitle("Trafo");
		this.setBackground(new Color(194,255,255));

		setLayout(null);
		
		loadfile.setBounds(550,300,100,20);
		safefile.setBounds(550,350,100,20);

		add(safefile);
		add(loadfile);
		
		loadfile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				JFileChooser fc = new JFileChooser();
				fc.showOpenDialog(null);
				file = fc.getSelectedFile();
				liesDatei();
				}
			});
		safefile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				JFileChooser fc = new JFileChooser();
				fc.showSaveDialog(null);
				file = fc.getSelectedFile();
				schreibDatei();
					}
				});
			}
	

	public void liesDatei()
	{
		BufferedReader br;
		String s;
		try
		{
			br = new BufferedReader(new FileReader(file));
			while ((s = br.readLine()) != null)
			{
				StringTokenizer st = new StringTokenizer(s, " ");
				// StringTokenizer st = new StringTokenizer(s, " ");
				// while (st.hasMoreTokens()) {
				String nr = st.nextToken();
				String rechts = st.nextToken();
				String hoch = st.nextToken();
				String zusatz = st.nextToken();
				System.out.println(nr + " " + hoch + " " + rechts);
				// }
			}
			br.close();
		}
		catch (IOException io)
		{
			System.out.println(io.getMessage());

		}
	}
	public static void schreibDatei()
	{
		File f = null;
		// Ausgabe in Datei
		try
		{
			f = new File("temp/test.dat");
			System.out.println(System.getProperty("user.dir"));
			System.out.println(f.getAbsolutePath());
			FileWriter fw = new FileWriter(f);
			System.out.println();
			fw.write("Das ist eine Testausgabe\r\nTextzeile 2");
			fw.close();
		}
		catch (IOException io)
		{
			System.out.println(io.getMessage());
		}
		// Einlesen und anzeigen
		String lese = "";
		int x = 0;
		try
		{
			FileReader fr = new FileReader(f);
			
			while ((x = fr.read()) != -1)
			{
				lese += (char) x;
			}
			fr.close();
		}
		catch (IOException io)
		{
			System.out.println(io.getMessage());
		}
		System.out.println(lese);
	}

	public static void main(String[] args)
	{
		DateiLeseTest d = new DateiLeseTest("Ein-/Ausgabe einer Datei");
		d.setVisible(true);
	}


	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}

PS. Ja ich weiß das die Ausgabedatei im Moment noch völlig unabhängig vom Input ist. Im Moment bin ich noch nicht soweit belesen, das ich das in Verbindung mit der BufferedReader setzen kann.
 

c_sidi90

Top Contributor
Ich gehe mal davon aus, du liest die Zeilen in einer While Schleife aus. Du könntest das Abbruchkriterium z.B. so setzen.

Java:
public static void main(String[]args) throws IOException{
		
		BufferedReader reader;
		reader = new BufferedReader(new FileReader("Pfad zur Datei"));
	
		String line;
		
		while((line = reader.readLine()).equalsIgnoreCase("End")){
			
			//tu etwas
		}
	}

Um zu bestimmen, wieviele Einträge die einzelnen Zeilen oder gar das Dokument hat, könntest du die einzelnen Einträge spliten. Dazu musst du ein String Array deklarieren, welches den gesplitteten Inhalt nach einem Regex enthält.

z.B.

Java:
String[]split = null;
split = line.split(" ") //Splittet nach einem Leerzeichen, sinnvoller sind Trennzeichen a la CSV (";").

Nun kannst du anhand des split Arrays die Länge ermitteln
Java:
split.length
 
B

BastianSeb

Gast
ok das mit der Abbruchbedingung find ich schonmal sehr gut.
Bisher erzeugt er jedoch keine Ausgabewerte noch wirft er einen Fehler aus. Ich denke mal er kommt aus der Schleife nicht mehr raus. Gleich mal googlen.

Das zweite von dir kapier ich entweder nicht oder ist leider nicht das was ich meine.
Mittels des StringTokenizer splitt ich doch schon alle Zeilen nach dem Kriterium "teile dort wo ein " " ist"
Auch brauch ich nicht die länge des Strings.
Ich will einen bestimmten String nach dessen Attributwert?/Inhalt auf der Zeile suchen (die ich ja schon pro Zeile jeweils erzeuge) und den darauffolgenden String mir ausgeben lassen
 
B

BastianSeb

Gast
So hab mal versucht das ganze weiter zu führen.

Meine Suche nach den Inhalten der Strings hab ich wie folgt gelöst.

Java:
public void liesDatei()
	{
		BufferedReader br;
		String s;
		int count = 1;
		try
		{
			br = new BufferedReader(new FileReader(file));
			//while ((s = br.readLine()) != null)
			while(! (s = br.readLine()).equalsIgnoreCase("End"))
			{ 
				count++;
				StringTokenizer st = new StringTokenizer(s, " ");
				
				 while (st.hasMoreTokens()) {
				/*String nr = st.nextToken();
				String rechts = st.nextToken();
				String hoch = st.nextToken();
				System.out.println(nr + " " + hoch + " " + rechts);
				// }*/
					 
				 String i = st.nextToken();
						if 
						(i.startsWith("Tag")) {
                            String Tag = st.nextToken();
                            String frei1 = st.nextToken();
                            String Sport = st.nextToken();
                            System.out.println
                            ("ALTER TABLE sport.tage DISABLE KEYS; INSERT INTO `tage`" +
                            "(`idtage`,`sport`,`kommentar`)VALUES (");
                            System.out.println( Tag + " ,"+ Sport +" ,1);");
                            System.out.println
                            ("ALTER TABLE `sport` DISABLE KEYS; INSERT INTO `sport`" +
                            "(`idsport`,`name_idname`)" +
                            " VALUES ("+Sport+",0); ALTER TABLE `sport` ENABLE KEYS;");
						}
						if
                            //String token = st.nextToken("2");
                        (i.matches("test")){
                        	String test = st.nextToken();
                        	System.out.println(test);
                        }                  
                            
                        if
                        (i.matches("Sport")) {
                            String Sport = st.nextToken();
                            System.out.println(Sport);
                        }
                 
				
				 	}	
			}
			br.close();
		}

(Mir ist aufgefallen das in meiner Input-Datei Sport immer nach Tag kam und bevor ich wieder vergesse wie das einzubinden war, hab ich es erstmal im code so gelassen)

Ich glaube das ganze sollte so funktionieren. Auch wenn es sehr unschön im Resultat aussieht, da ich bisher jede Tabelle für jeden Eintrag aufmach und wieder schließe und nicht die passenden Values erweitere. (wie man das ändern kann wär meine Bonusfrage)

Meine eigentliche Frage bezieht sich auf die Ausgabe in eine neue Datei.
Wenn ich das richtig gesehen hab, ist es mir nicht möglich die Ausgabe-Datei mit einem mal zu schreiben, da sich die variablen der "Tokens" sich im Prozess verändern. Gibt es die Möglichkeit das ganze wie in der console life in eine Datei zu schreiben?
hmm und würde da der Speicherbutton überhaupt sinn machen?
 
B

BastianSeb

Gast
vergesst die frage mit der Ausgabe in eine Datei.
Da schäm ich mich ja glatt für, so einfach war das
 
B

BastianSeb

Gast
Oh man das nimmt kein ende

Wie bekomm ich das hin, dass nach einem gefundenen Wort Bsp.:
Java:
if 
						(i.startsWith("Tag")....
nicht der folgende String aufgerufen wird, sondern die folgende Zeile, welche ich dann wieder in Strings zerlegen kann und am besten als eine Art bedingte Schleife siehe folgendes.

Veranschaulicht:
Alles was an Tag X passiert ist auch im inputfile in den Nachfolgenden Zeilen
Alles was an Tag X und beim Sport X passiert steht in den Nachfolgenden Zeilen

Ich möchte am Ende die Schleife "Suche nach Tag, nehme X -> geh in die nächste Zeile, nehme Sport -> geh in die nächste Zeilen, nehme a,b,c ... Wenn wieder "Tag", nehme x > geh in die nächste Zeile, nehme Sport -> geh in die nächste Zeilen, nehme a,b,c ... usw.



Uploaded with ImageShack.us
 

Oben