# String zerlegen



## atango (9. April 2007)

Hallo zusammen,

ich habe folgenden String aus einer Textdatei ausgelesen.
Bücher := SET OF ( Buch :=TUPEL OF (ISBN: String;
			            Titel: String;
			            Verlagsname: String;
			            Autoren:= LIST OF( Autor: String );
			            Stichworte:= SET OF( Stichwort: String );
			            Versionen:= SET OF
                                                            ( Version := TUPEL OF (Auflage:Integer;
						Jahr:Integer)))

Jetzt muss ich ihn, in dieser Form Zerlegen:

Bücher := SET OF;
Buch := TUPEL OF;
ISBN :String;
Titel : String;
Verlagsnamen : String;
Autoren := LIST OF;
Autor : String;
Stichworte := LIST OF;
Stichwort : String;
Versionen := SET OF;
Version := TUPEL OF;
Auflage : Integer;
Jahr : Integer;

Wie mache ich das am besten?

Gruß


----------



## tobias_petry (9. April 2007)

Das beste wäre ein Regulärer Ausdruck,und so funktioniert es in Java


----------



## atango (10. April 2007)

Erstmal danke dir Tobias für den Tipp.
Ich habe mich den ganzen Vormittag damit gequellt und nicht geschafft, den Regulären Ausdruck so hin zu bekommen das es funktioniert.
Nach „:=“ oder „:“ zu suchen ist nicht schwer. Aber nur das Wort vor und nach dem gefundenen Zeichen auszugeben, kriege ich nicht hin.

zB.:  Bücher := SET OF ( Buch := TUPEL OF (ISBN: string…..))

Ergebnis soll so aussehen:

Bücher := SET OF
Buch := TUPEL OF
ISBN : string
.
.
.
.


----------



## KlaDi (10. April 2007)

Hallo,

verstehe ich das richtig, das das hier:

```
Bücher := SET OF ( Buch :=TUPEL OF (ISBN: String;
Titel: String;
Verlagsname: String;
Autoren:= LIST OF( Autor: String );
Stichworte:= SET OF( Stichwort: String );
Versionen:= SET OF
( Version := TUPEL OF (Auflage:Integer;
Jahr:Integer)))
```

ein String ist oder ist jede Zeile eine String?
Wenn es ein String ist, dann ersetze doch erstmal die überflüssigen Zeichen wie "(", ")" etc. erstmal mit "", also 
	
	
	



```
deinstring.replace("(", "").replace(")". "");
```
.
Anschließend teilst Du ihn an den Leerzeichen und schreibst alles in ein Array, dann durchsuchst Du Dein Array nach := oder : und gibst erst dann die Stelle davor, die, wo Du := oder : gefunden hast und die Stelle danach aus, dann ist es doch fast das was Du willst oder nicht?

Ggf. musst Du halt noch Leerzeichen einfügen.


----------



## atango (10. April 2007)

Ja richtig, das ganze ist ein String. Dein Vorschlag gefehlt mir. Probiere es gleich aus.


----------



## atango (10. April 2007)

Wie kann ich den String Wort für Wort absuchen und auch so in Array schreiben? Ich habe es nur Zeilenweise hinbekommen. 
Gruß


----------



## KlaDi (10. April 2007)

So in etwa sollte es aussehen:

```
String str = "Bücher := SET OF ( Buch :=TUPEL OF (ISBN: String;
Titel: String;
Verlagsname: String;
Autoren:= LIST OF( Autor: String );
Stichworte:= SET OF( Stichwort: String );
Versionen:= SET OF
( Version := TUPEL OF (Auflage:Integer;
Jahr:Integer)))";
Array strsplit = new Array();

strsplit[] = str.split(" ");
```
Dann hast Du jedes Wort einzeln im Array, Also strsplit[0] wäre "Bücher", strsplit[1] wäre ":=" usw.

Gruß KlaDi.


----------



## Bernd1984 (10. April 2007)

Hallo, 

oder so

```
import java.util.*;
import java.util.StringTokenizer;

public class ReplaceString
{
    public static void main(String[] args)
    {
        String text = "Bücher := SET OF ( Buch :=TUPEL OF (ISBN: String;" +
            "Titel: String;"+
            "Verlagsname: String;"+
            "Autoren:= LIST OF( Autor: String );"+
            "Stichworte:= SET OF( Stichwort: String );"+
            "Versionen:= SET OF"+
            "( Version := TUPEL OF (Auflage:Integer;"+
            "Jahr:Integer)))";
        System.out.println(text);
        text = text.replace('(',';').replace(')',' ');
        StringTokenizer tokenizer = new StringTokenizer( text, ";" );
        ArrayList zeile = new ArrayList();
        while (tokenizer.hasMoreTokens())
        {
            String a = (tokenizer.nextToken()).trim()+";";
            zeile.add(a);
            System.out.println(a);
        }
        System.out.println(zeile);
    }
}
```
Im Array oder so als Ausgabe.



> Bücher := SET OF ( Buch :=TUPEL OF (ISBN: String;Titel: String;Verlagsname: String;Autoren:= LIST OF( Autor: String );Stichworte:= SET OF( Stichwort: String );Versionen:= SET OF( Version := TUPEL OF (Auflage:Integer;Jahr:Integer)))
> Bücher := SET OF;
> Buch :=TUPEL OF;
> ISBN: String;
> ...


----------



## atango (10. April 2007)

Danke euch! Es funktioniert jetzt.
Gruß


----------



## atango (11. April 2007)

Hallo,
habe folgendes Problem:

Möchte aus einer text.txt Datei alles in einen StringBuffer einlesen und mit toString(); die Variable s in einen String umwandeln und dann ausgeben. Wenn ich direkt ein String nehme, also ohne aus Datei zu lesen sondern direkt von String, funktioniert das. Hat jemand ein Vorschlag?

Gruß


```
import java.io.FileReader;
import java.util.ArrayList;
import java.util.StringTokenizer;


public class DatenTypeAuslesen {
	
	private static StringBuffer s = new StringBuffer();
	
	public static void main(String[] args){
		//Insstanz von FileReader erzeugen und dadurch
		// Stream öffnen
		try{
			
			FileReader reader = new FileReader("text.txt");
			int einlesen = 0;
			//StringBuffer s = new StringBuffer();
			// Solange Zeichen lesen bis -1 zurückgegeben wird
			while ((einlesen = reader.read()) != -1) 
				{
					//char zeichen = (char)einlesen;
					s.append(einlesen);
			
					// Zeichen auf Output-Stream zur Konsole schreiben  
					//System.out.println(einlesen);
					// Stream schließen
				}
			
			reader.close();
			}
		catch (Exception e) 
		{
			  System.out.println("Es trat ein Fehler auf");
		}
						
        String text = s.toString();
        //System.out.println(text);
        text = text.replace('(',';').replace(')',' ');
        StringTokenizer tokenizer = new StringTokenizer( text, ";" );
        ArrayList zeile = new ArrayList();
        while (tokenizer.hasMoreTokens())
        {
            String a = (tokenizer.nextToken()).trim()+";";
            zeile.add(a);
            System.out.println(a);
        }

}
}
```

Alles was ich bekomme sind Zahlen

66252991041011143258613283698432797032406611799104325861328485806.............


----------



## Thomas Darimont (11. April 2007)

Hallo,

das kann man auf mehrere Arten machen, hier mal zwei Beispiele:

```
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Scanner;

/**
 * @author thomas.darimont
 * 
 */
public class GetTextFileContentAsStringExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(new File("d:/UserTablespaces.sql"));
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        while (scanner.hasNextLine()) {
            printWriter.println(scanner.nextLine());
        }
        scanner.close();
        printWriter.close();
        
        String contents = stringWriter.toString();
        
        System.out.println(contents);
    }
}
```

oder so:

```
/**
 * 
 */
package de.tutorials;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.channels.Channels;

/**
 * @author thomas.darimont
 * 
 */
public class GetTextFileContentAsStringExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		File file = new File("d:/UserTablespaces.sql");
		FileInputStream fileInputStream = new FileInputStream(file);
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		fileInputStream.getChannel().transferTo(0, (int) file.length(),
				Channels.newChannel(byteArrayOutputStream));
		System.out.println(new String(byteArrayOutputStream.toByteArray(),
				"UTF-8")); //entsprechendes Encoding setzen...
	}
}
```

Gruß Tom


----------



## atango (11. April 2007)

PERFEKT Ich danke Dir!
Gruß
Richard


----------

