# Problem mit \t



## Don83 (4. Mai 2012)

Hallo,
ich arbeite mit Daten, deren Felder/Spalten durch Seperatoren getrennt sind. Also als Seperatoren zähle ich jetzt z.B. folgende Symbole: {:;,\t-} usw.

Ich habe nun eine Methode geschrieben, die aus einer config Datei den aktuellen Seperator liest. 
Diesen habe ich wie folgend in der config Datei angegeben: Seperator:\t
Über einen einfachen split am : wird also der Seperator gelesen und als String gespeichert.
Wenn das nun \t ist habe ich ein Problem. 

Ich lese also den Seperator aus der file: String seperator = getSeperator();
So nun mache ich zwei print out Meldungen:
System.out.println("hi"+seperator +"hi");
System.out.println("hi\thi");

Sollte ja an sich das selbe zurückgeben. Wie man aber sieht, funktioniert das tab Signal nur bei der zweiten print Anweisung:
hi\thi
hi	hi

Ich habe auch schon ausprobiert, in der config file nicht Seperator:\t anzugeben sondern Seperatortab gedrückt)

Wenn ich dies tue funktioniert alles. Aber lieber wäre es mir wenn eben \t in der config file stehen würde. Kann ich den String \t irgendwie in ein "echtes" tab umwandeln?


----------



## c_sidi90 (4. Mai 2012)

Probier es mal nach \\t zu splitten.


----------



## andre111 (4. Mai 2012)

Hi, dein Problem ist, dass \t lediglich in String-Literalen als Escapesequenz interpretiert wird, d. h. in einen Tab umgewandelt wird. Wenn du aus deiner config-Datei den String \t ausliest, dann werden lediglich 2 Zeichen und zwar \ und t eingelesen. Dementsprechend müsstest du beim einlesen des Separators überprüfen ob er z. B. mit \ beginnt (also eine Escapesequenz ist) und diese dann dementsprechend umwandeln.


----------



## Gast2 (4. Mai 2012)

Mit anderen Worten: Da \t eine Escape Sequenz für tab ist und Java schlau wird das \t aus der config Datei beim speichern in das String Objekt automatisch escaped, sodass \\t im String landet. Resultat: Es wird \t ausgegeben wie in der config file angegeben!


----------



## andre111 (4. Mai 2012)

@kappesf: Java erkennt Escapesequenzen nur in String-Literalen im Programmcode. Beim Einlesen aus einer Datei werden genau die einzelnen Zeichen in einem String abgespeichert, die auch in der Datei stehen. Damit \t (die beiden Zeichen \ und t) in der Datei als Tab interpretiert werden, müssen diese explizit geparsed werden.
EDIT: Ich glaub ich hab dich falsch verstanden, aber trotzdem wird definitiv nichts automatisch escaped beim Einlesen aus einer Datei. Deine Aussage, ist insofern richtig, wenn du mit "\\t im String" "\\" als Escapesequenz ansiehst.


----------



## SlaterB (4. Mai 2012)

```
public class Test
{
    public static void main(final String[] args)
    {
        String s = "\\t"; // \t als zwei Zeichen, so soll es in der Datei stehen (dort steht \t)
        System.out.println("|" + s + "|"); // Ausgabe als zwei Zeichen
        s = s.replace("\\t", "\t"); // Ersetzen, falls vorhanden, funktioniert auch wenn
                                    // anderer Separator gesetzt ist, macht dann nichts
        System.out.println("|" + s + "|"); // Ausgabe Tab
    }
}
```


----------



## Gast2 (4. Mai 2012)

andre111 hat gesagt.:


> @kappesf: Java erkennt Escapesequenzen nur in String-Literalen im Programmcode. Beim Einlesen aus einer Datei werden genau die einzelnen Zeichen in einem String abgespeichert, die auch in der Datei stehen. Damit \t (die beiden Zeichen \ und t) in der Datei als Tab interpretiert werden, müssen diese explizit geparsed werden.
> EDIT: Ich glaub ich hab dich falsch verstanden, aber trotzdem wird definitiv nichts automatisch escaped beim Einlesen aus einer Datei. Deine Aussage, ist insofern richtig, wenn du mit "\\t im String" "\\" als Escapesequenz ansiehst.



Er erkennt, dass in der Datei ein \ steht und weil Java weiss, dass das \ zum escapen benutzt wird, aber davon ausgeht, dass man eben ein \ ausgeben will, wird das \ selbst escaped. Daher wird aus einem \t in einer Datei ein \\t in einem String und wiederum ein \t in der Ausgabe. Will man das t zum tab escapen muss man selber parsen.


----------



## Don83 (4. Mai 2012)

Ok alles klar. Die Zeile hier hats gerichtet:
output = output.replace("\\t", "\t");
Vielen Dank an alle!


----------



## Gast2 (4. Mai 2012)

Hast du auch verstanden wieso?


----------



## Don83 (4. Mai 2012)

Ja


----------

