String splitten
lima-city → Forum → Programmiersprachen → Java
code
erstellung
freuen
funktion
gelesene teil
http
jemand
normal funktionieren
normale zelle
platzhalter
private string
problem
regeln
semikolon
string
tabelle
url
zeichen
zeile
zelle
-
Hi,
ich habe ein Problem beim Splitten eines Strings, genauer gesagt einer Zeile aus einer .csv Tabellendatei. Das Problem ist, dass in manchen Strings, die ja Tabellenzellen darstellen, auch das Trennzeichen (Semikolon) vorhanden sein kann. Wenn in der Zelle ein Semikolon vorhanden ist, ist der ganze String in Anführungszeichen gesetzt. Java trennt mit String[] split = input.split(";") ja jedes Mal.
Eine Zeile sieht z.B. so aus:
2011;004;AA.999999.000;;"Hier ist ein; im String";eine normale Zelle, mehr Zellen;;111111111;Zelle;222222222;333;;4,55;6,77;EUR;01.01.2011;01.12.2011
Ergibt ja 19 Strings(wenn ich mich jetzt nicht verzählt habe).
Ich möchte aber nur 18 Strings haben, es soll eben nicht an dem Semikolon in den Anführungszeichen getrennt werden, an den anderen soll alles ganz normal funktionieren. Das Semikolon von vornherein aus der Tabelle zu nehmen ist keine Option, auf die Erstellung der Tabelle habe ich keinen Einfluss.
Vielleicht hat ja jemand eine Lösung für dieses Problem, würde mich sehr Freuen!
mfg
hk1992 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hk1992 schrieb:
Vielleicht hat ja jemand eine Lösung für dieses Problem, würde mich sehr Freuen!
Auf den ersten Blick hätte ich empfohlen, ein Regex zu verwenden. Es gibt aber eine bessere Lösung, auf dieser Webseite wird geraten, aufgrund des Problemes die Lib CSVReader zu vewenden.
Beitrag zuletzt geändert: 17.10.2011 16:19:25 von trueweb -
wieso nimmst du nicht einen anderen Platzhalter, also statt ; einfach | oder ~ oder # dann kannst du das via split() sicher leicht regeln
Beitrag zuletzt geändert: 18.10.2011 6:00:13 von pooldreams -
pooldreams schrieb:
wieso nimmst du nicht einen anderen Platzhalter, also statt ; einfach | oder ~ oder # dann kannst du das via split() sicher leicht regeln...auf die Erstellung der Tabelle habe ich keinen Einfluss.
Danke trueweb, ich schau mir das mal an
Edit: Habe es mit dem CSVReader gelöst, ging ziemlich problemlos, Danke.
Beitrag zuletzt geändert: 18.10.2011 16:38:38 von hk1992 -
Hallo hk1992,
falls es dich noch interessiert: Ich hätte da auch eine Möglichkeit mithilfe einer selbstgeschriebenen Methode. Falls man nicht noch andere Funktionen eines CSV-Readers benötigt, wäre das vielleicht sogar eine einfachere Variante.
Hier der Code:
private String[] specialSplit(String s,String separator){ boolean inString = false; //Gibt an, ob man sich beim gerade untersuchten Zeichen in einem String befindet. String sepBuffer = ""; //Wenn der Separator länger, als ein Zeichen ist, wird hier der schon gelesene Teil des Separators reingeschrieben String stringBuffer = ""; //Hier wird der bisher gelesene Teil der aktuellen "Zelle" reingeschrieben Vector<String> ret = new Vector<String>(); //Diesen Vector gibt die Funktion als Array zurück for(int i=0;i<s.length();i++){ //Gehe den String Zeichen für Zeichen durch if(s.charAt(i)=='"'){ inString = !inString; //Bei " wird von In-String zu Außerhalb-vom-String gewechselt und andersrum } if(inString){ stringBuffer += s.charAt(i); //Im String wird der StringBuffer natürlich weiter gefüllt sepBuffer = ""; //Wenn man im String ist, wird ein "angefangener" Separator verworfen }else{ if(separator.startsWith(sepBuffer+s.charAt(i))){ sepBuffer += s.charAt(i); //Wenn das aktuelle Zeichen zu einem Separator gehört, wird der sepBuffer gefüllt if(sepBuffer.equals(separator)){ ret.add(stringBuffer);//Wenn der Separator vollständig gelesen ist, wird die gelesene "Zelle" dem Vector hinzugefügt sepBuffer = ""; stringBuffer = ""; } }else{ stringBuffer+=s.charAt(i); } } } return ret.toArray(new String[0]); }
Floscher -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage