Strings zerlegen

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
Guten Morgen!

Wieder einmal möchte ich Variablen aus einer Textdatei auslesen, die aus Zeilen wie folgt besteht:
R3=10000006R4=20000010 R5=20000300....

An sich kein Problem, ich kann jede Zeile in tokens zerlegen und dann auslesen.
Die Schwierigkeit bei mir jedoch:
Manchmal befindet sich zwischen den einzelnen Variablen ein Leerzeichen, dann wieder nicht. Und das kann in jeder Zeile wieder anders aussehen. Z.B. könnte erneut eine Zeile mit den gleichen Variablen kommen, diesmal aber komplett ohne Leerzeichen:
R3=10000006R4=20000010R5=20000300

oder aber auch mit Leerzeichen nach jeder Variablen:
R3=10000006 R4=20000010 R5=20000300

Wie lese ich das jetzt am besten ein? Ich suche also z.B. nach "R3", lese dann den substring ab dem "=" - aber bis wohin? Gibt's eine Möglichkeit, die anweist: lies bis zu einem Leerzeichen oder zu einem String (hier also bis zum nächsten "R") ?

(wobei ich selbst dann mit meiner Lösung nicht ganz zufrieden bin, denn wenn ich z.B. die Zeile
R3=10000006R4=20000010 R5=20000300
in tokens zerlege, mit dem Trennzeichen " ", dann lautet der erste token "R3=10000006R4=20000010", und ich muss dann wieder extra R4 rauspfriemeln... hat jemand vielleicht eine elegantere Idee?

LG
Julia
 

HLX

Top Contributor
Wie zerlegst du den String denn bislang?

Ggf. kannst du das gleiche Verfahren wie bisher anwenden und anschließend einfach mit trim() die Leerzeichen entfernen.
 
G

Gast

Gast
Hallo,
mach doch folgendes:
Lies die Zeile
haue alle Leerzeichen raus
lese aus wie gewohnt

Code:
public class Test {

	
	
	public static void main(String[]args){
		String r = "Hallo ich bin da";
		r=r.replaceAll(" ", "");
		System.out.println(r);
	}
}
ergibt:

Code:
Halloichbinda
 
G

Gast

Gast
Servus,

nicht sehr elegant, aber ich würde auch alle Leerzeichen entfernen,
dann nach R splitten und wenn Du es brauchst, das R wieder hinschreiben.

Gruß
 

julchen81

Bekanntes Mitglied
ahh... hört sich schon mal gut an. Danke!

Nur klappt das mit dem Splitten nach R nicht, weil nicht alle Variablen R heißen. Es gibt neben Variablen R1, R12... auch eine ganze Reihe von Variablen, die nur aus einem Buchstaben bestehen, z.B. I, N, T...

Wenn ich jetzt nach all diesen Variablen splitte, dann stehen aber in dem sich ergebenden Array diese Variablen nicht mehr drin, und ich kann die Werte dann nicht zuordnen. (In meinem Ausgangstest gibt es auch keine festgelegte Reihenfolge der Variablen).

Könnte man nicht irgendwie so vorgehen:
Alle Leerzeichen aus dem Text entfernen.
dann
Code:
if ((zeile.substring(0)).equals("R1")) {
    dann substring nehmen ab zeile.substring(3, bis zum nächsten String)}
else if ((zeile.substring(0)).equals("I")) {
    dann substring nehmen ab zeile.substring(2, bis zum nächsten String)}
...

also alle Variablen mit if abfragen, und dann den Substring lesen bis eben kein Integer/Double-Wert mehr kommt, sondern ein String.

Dann wieder ab hier substring erstellen und wie oben alle Variablen abfragen... also das gleiche Spielchen von vorne.


Hoffe, ich konnte das einigermaßen schnell verständlich darstellen :?
Mir wäre schon sehr geholfen, wenn jm. einen Vorschlag hätte, wie ich "bis zum nächsten String" einlese...

Ciao, Julia
 

Quaxli

Top Contributor
Wieviele verschiedene Variablen gibt es denn?
Bevor Du mit aufwendigem Code jede Zeile durchnudelst macht es u. U. Sinn, einfach verschiedene Buchstaben durchzuprobieren?

Also erst nach "R" splitten, wenn da kein vernünftiges Array bei raus kommt, nach dem nächsten Buchstaben splitten, usw.? Aber das müßtest Du entscheiden, kann man so aus der Ferne nicht sagen, ob das eine vernünftige Vorgehensweise ist.
 

HLX

Top Contributor
Ein immer wiederkehrender Trenner ist das "="-Zeichen. Vielleicht könnte man auch hier splitten und dann die Variable extrahieren. Etwa so (Beispiel auf die Schnelle):

Code:
List compileSet(String aSet) {
    List result = new ArrayList();
    int i = 0;
    int j = 0;
    while (j != aSet.length() - 1) {
        j = aSet.indexOf("=", i) + 1;
        if (j == 0)
            j = aSet.length() - 1;
        String subset = aSet.substring(i, j);
        String variable = extractVariable(subset);
        String value = null;
        if (variable != null)
            value = subset .substring(0, subset.indexOf(variable));
        else
            value = subset .substring(0);
        if (value != null)
            result.add(value.trim());
        if (variable != null) {
            result.add(variable);
        }
        i = j;
   }
    return result;
}

private String extractVariable(String aSubset) {
    if (aSubset.contains("I=")) {
        return "I";
    }
    if (aSubset.contains("R2=")) {
        return "R2";
    }
    if (aSubset.contains("R3=")) {
        return "R3";
    }
    return null;
}
 

julchen81

Bekanntes Mitglied
@Quaxi:
Danke für deinen Tipp, aber ich halte das nicht für sehr praktisch in meinem Fall. Wieviele Variablen ich habe, ist unterschiedlich (ich soll mein Programm für verschiedene InputDateien schreiben und je nach dem möglichst flott abändern).

Und nach verschiedenen Variablen zu splitten, wenn in einer Zeile verschiedene Variablen vorkommen... ist wohl auch nicht ganz praktisch.

@HLX
Leider ist nicht immer ein "="-Zeichen Trenner - nur bei den Variablen, die mit einem "R" beginnen. Aber echt lieben Dank für deine Überlegung!

Viele Grüße,
Julia
 

HLX

Top Contributor
Das sollte eigentlich kein Problem sein.

Sofern ein eindeutig identifizierbarer Trenner existiert kannst du diesen per Oder-Verknüpfung in die Trennerabfrage aufnehmen und in der Methode 'extractVariable' dort wo nötig das '=' gegen den anderen Trenner austauschen.

EDIT: oder-Verknüpfung reicht nicht ganz. Du müsstest herausfinden, welcher Trenner im Satz jeweils als nächstes kommt. Also jeweils den nächsten Index bestimmen und den kleineren dann nehmen.
 
G

Gast

Gast
Hallo,

wenn es sich immer um ein Buchstabe handelt, würde ich jedes Zeichen einer Zeile lesen und wenn es sich um einen
Buchstabe handelt (ASCII Tabelle), dann startest Du einen neuen Token. Ist halt nicht sehr performant. Du solltest aber schon wissen, was Du da ausliest. Du kannst kein Programm schreiben, was alles auslesen und selbstständig erkennen.
 

julchen81

Bekanntes Mitglied
Erstmal wieder Danke an Gast und HLX!

@Gast
Aber wie bitte überprüfe ich, ob es sich um ein ASCII-Zeichen handelt?

@HLX:
Nicht EIN Trenner, sondern eine Menge von Trennern ist eindeutig identifiziert. Wie bitte kann ich herausfinden, welcher Trenner im Satz jeweils als nächstes kommt?

LG
Julia
 

HLX

Top Contributor
Wie geschrieben - Indizes vergleichen.

Ungetestetes Beispiel auf die Schnelle:

Code:
private int getNextSeparatorIndex(String set, int beginIndex) {
    int[] indices = new int[3];
    indices [0] = set.indexOf("=", beginIndex); 
    indices [1] = set.indexOf("<", beginIndex);
    indices [2] = set.indexOf(">", beginIndex);
    int nextIndex = indices[0];
    for(int i=1; i  < indices.length;i++) {
        if(indices[i] != 0 && indices[i] < nextIndex)
            nextIndex = indices[i];
    }
    return nextIndex;        
}
 

schalentier

Gesperrter Benutzer
Wie waers mit Regular Expressions:

Code:
public static void main(String[] args) {
        Pattern param = Pattern.compile("([A-Za-z]+[0-9]*?)\\s*?(=|-)\\s*?([0-9\\.]+)");

        String s = "R3=10000006R4=2000.0010 R5-20000300, III77=   7222";

        Matcher m = param.matcher(s);
        while( m.find() ) {
            System.out.println(m.group(1)+" = "+m.group(3)+" (Trenner: "+m.group(2)+")" );
        }
}

Ausgabe:

Code:
R3 = 10000006 (Trenner: =)
R4 = 2000.0010 (Trenner: =)
R5 = 20000300 (Trenner: -)
III77 = 7222 (Trenner: =)
 

julchen81

Bekanntes Mitglied
@schalentier
ich habe mich letzte Woche schon mal kurz mit Regular Expressions beschäftigt, aber nur oberflächlich, sodass ich deinen Vorschlag jetzt nicht komplett verstehe.
Aber freue mich über deine Anregung, werde mich eventuell noch mal intensiver damit befassen! (Sogar sehr sicher)

Schönen Feierabend!
Julia
 

schalentier

Gesperrter Benutzer
Jo, gugg dir die Regular Expression unbedingt mal an. Das ist zeitloses (und programmiersprachenloses) Wissen, denn man kann Regexp in jeder besseren Sprache finden.

Mit Regexp kannst du Muster in Strings finden.
Code:
R3=10000006
wuerde z.b. genau diesen Text finden.

Das kann man nun verallgemeinern:
Code:
R3=([0-9]+) // findet alles, was mit 'R3=' anfaengt und mit beliebig vielen, aber mindestens einer (+) Ziffer ([0-9]) endet

([A-Za-z]+)=([0-9]+) // findet alles was mit beliebig vielen (mindestens aber einem) Buchstaben beginnt

([A-Za-z]+[0-9]*)=([0-9]+) // * ist beliebig viel (auch gar nicht) 

([A-Za-z]+[0-9]*)(=|-)([0-9]+) // Zuerst Buchstaben, dann Ziffern, dann entweder '=' oder '-' und dann die letzen Ziffern

([A-Za-z]+[0-9]*)\\s*(=|-)\\s*([0-9]+) // '\\s' sind alle leerzeichen (tabs, zeilenende, etc)

Gibt natuerlich noch 1000 andere Dinge. Tjo und mit dem Matcher aus dem Quellcode in meinem vorigen Post kann man nun einen gegebenen String solange nach diesem Muster durchsuchen, bis keins mehr gefunden wird. Die Werte in den runden Klammern kann man dann mit Matcher.group(int) abfragen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Strings zerlegen und Schlüsselwörter finden Java Basics - Anfänger-Themen 7
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10
K Strings bearbeiten Java Basics - Anfänger-Themen 14
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
L Java Strings Buchstaben vertauschen Java Basics - Anfänger-Themen 4
L Strings in einem JOptionPane farbig Java Basics - Anfänger-Themen 2
A Wie bekomme ich zwei Strings in eine ArrayList Java Basics - Anfänger-Themen 4
C Chars eines Strings mit for schleife rückwärts auslesen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben