2016-12-07 4 views
0

Ich habe eine Zeichenfolge wieSplitting String durch Komma und ignoriert Komma in mehreren Anführungszeichen

Wert 1, Wert 2, "Wert 3", Wert 4, Wert 5 "", den Wert 6

ich mag diese gefunden durch Komma und ignorieren Kommas in einem Ausdruck von mehreren doppelten Anführungszeichen

Meine gewünschte Ausgabe sollte

eingeschlossen aufzuzuspalten

Wert 1

Wert 2

"Wert 3", Wert 4, Wert 5 ""

Wert 6

habe ich versucht, diese Splitting on comma outside quotes aber es funktioniert nicht

Vielen Dank im Voraus .......... Elsayed

+1

eine CSV-Parser Bibliothek Versuchen wie einer der [hier] aufgelisteten (https://stackoverflow.com/questions/22137343/java-csv-parser-comparisons). – cxw

+1

Wie CXW sagt: Erfinde das Rad nicht neu. Glauben Sie uns, bauen Sie Ihren ** eigenen ** CSV-Parser und bekommen Sie das ** richtig ** ist ein ** wichtiger ** Stück Arbeit. – GhostCat

+0

Wenn man sich diesen Eingang ansieht, ist nicht klar, was die gewünschte Ausgabe ist. Bitte angeben. –

Antwort

0

Ich weiß nicht wie Verwenden Sie Regex, um es zu lösen.

Sind die doppelten Anführungszeichen jetzt enthalten? Ich habe diesen Code noch nicht ausprobiert.

public static List<String> splitByComma(String text) { 
    ArrayList<String> ret = new ArrayList<>(); 
    char[] chars = text.toCharArray(); 
    boolean inQuote = false; 
    StringBuilder tmp = new StringBuilder(); 
    for (char ch : chars) { 
     if (ch == ',') { 
      if (inQuote) tmp.append(ch); 
      else { 
       ret.add(tmp.toString()); 
       tmp.setLength(0); 
      } 
     } else if (ch == '"') { 
      tmp.append(ch); // I just add this code 
      inQuote = !inQuote; 
     } else tmp.append(ch); 
    } 
    ret.add(tmp.toString()); 
    return ret; 
} 

Bitte sagen Sie mir, wenn mein Code ein Problem hat.

+0

es funktioniert nicht gut mit diesem Fall funktioniert es ähnlich http://stackoverflow.com/questions/18893390/splitting-on-comma-outside-quotes – Elsayed

+1

@Elsayed Meinst du, dass Sie die Anführungszeichen behalten möchten ? – EmOwen

+0

Ja, ich möchte die Anführungszeichen behalten – Elsayed

0

Nun zuerst würde ich empfehlen, innere doppelte Anführungszeichen, e. G. Wert 1, Wert 2, "Wert 3," Wert 4, Wert 5 ", Wert 6. Mit dieser Art von Syntax ist eine Methode, die ich für diesen Zweck verwende, unten. Es ist ein wenig komplexer als der erste Vorschlag, weil Leerzeichen und Zeilenumbrüche zwischen einem Komma und dem nächsten Element in der Liste ignoriert werden.

public static String[] splitSet(String inStr, char delimiter) { 
    if (inStr == null) 
     return null; 
    if (inStr.isEmpty()) 
     return new String[]{}; 
    /* 
    * add an empty element here and remove it at the end to simplify 
    * algorithm 
    */ 
    String delimiterStr = String.valueOf(delimiter); 
    String parseStr = inStr + delimiterStr + " "; 
    /* 
    * prepare parsing. 
    */ 
    Vector<String> list = new Vector<>(); 
    String element = ""; 
    int lc = 0; 
    char b = ' '; 
    char c; 
    boolean inBetweenQuotes = false; 
    /* 
    * parsing loop. 
    */ 
    while (lc < parseStr.length()) { 
     c = parseStr.charAt(lc); 
     /* 
     * add current entry and all following empty entries to list vector. 
     * Ignore space and new line characters following the delimiter. 
     */ 
     if ((c == delimiter) && !inBetweenQuotes) { 
      // flag to avoid adding empty elements for delimiter being blank 
      // or new line 
      boolean added = false; 
      while ((lc < parseStr.length()) 
        && ((c == delimiter) || (c == ' ') || (c == '\n'))) { 
       if ((c == delimiter) 
         && !(added && ((c == ' ') || (c == '\n')))) { 
        list.add((String) UFormatter.parseElement(element, 
          DataType.STRING, delimiterStr)); 
        element = ""; 
        added = true; 
       } 
       lc++; 
       if (lc < parseStr.length()) 
        c = parseStr.charAt(lc); 
       if (lc > 0) 
        b = parseStr.charAt(lc - 1); 
      } 
     } 
     /* 
     * add character to tmpList. Close String literal or Vector literal 
     */ 
     else { 
      element = element + c; 
      // toggle inBetweenQuotes at not escaped '"' 
      if ((c == '"') && (b != '\\')) 
       inBetweenQuotes = !inBetweenQuotes; 
      lc++; 
      b = c; 
     } 
    } 
    if (!element.isEmpty() && inBetweenQuotes) 
     list.add(element.substring(0, element.length() - 1) + "\""); 
    else if (!element.isEmpty()) 
     list.add(element.substring(0, element.length() - 1)); 
    // put Vector to array. 
    String[] ret = new String[list.size()]; 
    for (int i = 0; i < list.size(); i++) 
     ret[i] = list.elementAt(i); 
    return ret; 
} 
Verwandte Themen