kostenloser Webspace werbefrei: lima-city


String splitten

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. t*****b

    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
  4. 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
  5. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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
  6. 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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!