7

私は以下のような文字列を持っています -

値1、値2、値3、値4、「値5、1234」、値6、値7、「値8」、値9、「値10、123.23」

上記の文字列をトークン化すると、カンマ区切りのトークンが得られます。しかし、文字列トークナイザーは、分割中に二重引用符の後のコンマを無視するように言いたいです。どうすればこれを言うことができますか?

前もって感謝します

シャシ

4

6 に答える 6

3

必要なのは、1 行と正しい正規表現だけです。

String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?");

これにより、最後の引用符を含め、折り返しの二重引用符もきれいに削除されます。

注:最初の用語が引用されている場合の興味深いエッジ ケースでは、 を使用して先頭の引用符をトリミングする追加の手順が必要でしたreplaceAll()

ここにいくつかのテストコードがあります:

String input= "\"value1, value2\", value3, value4, \"value5, 1234\", " +
    "value6, value7, \"value8\", value9, \"value10, 123.23\"";
String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?");
for (String s : values)
System.out.println(s);

出力:

value1, value2
value3
value4
value5, 1234
value6
value7
value8
value9
value10, 123.23
于 2013-10-08T08:32:31.077 に答える
2

私は正規表現にアレルギーがあります。誰かが提案したように、なぜ二重に分割しないのですか?

    String str = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";
    boolean quoted = false;
    for(String q : str.split("\"")) {
        if(quoted)
            System.out.println(q.trim());
        else
            for(String s : q.split(","))
                if(!s.trim().isEmpty())
                    System.out.println(s.trim());
        quoted = !quoted;
    }
于 2015-05-15T06:56:17.230 に答える
1

サードパーティのライブラリに依存しない場合、次のコードは、指定された要件に従ってフィールドを解析することもできます。

import java.util.*;

public class CSVSpliter {

  public static void main (String [] args) {
    String inputStr = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";

    StringBuffer sb = new StringBuffer (inputStr);
    List<String> splitStringList = new ArrayList<String> ();
    boolean insideDoubleQuotes = false;
    StringBuffer field = new StringBuffer ();

    for (int i=0; i < sb.length(); i++) {
        if (sb.charAt (i) == '"' && !insideDoubleQuotes) {
            insideDoubleQuotes = true;
        } else if (sb.charAt(i) == '"' && insideDoubleQuotes) {
            insideDoubleQuotes = false;
            splitStringList.add (field.toString().trim());
            field.setLength(0);
        } else if (sb.charAt(i) == ',' && !insideDoubleQuotes) {
            // ignore the comma after double quotes.
            if (field.length() > 0) {
                splitStringList.add (field.toString().trim());
            }
            // clear the field for next word
            field.setLength(0);
        } else {
            field.append (sb.charAt(i));
        }
    }
    for (String str: splitStringList) {
        System.out.println ("Split fields: "+str);
    }
}

}

これにより、次の出力が得られます。

分割フィールド: value1

分割フィールド: value2

分割フィールド: value3

分割フィールド: value4

分割フィールド: value5、1234

分割フィールド: value6

分割フィールド: value7

分割フィールド: value8

分割フィールド: value9

分割フィールド: value10、123.23

于 2013-10-08T09:12:47.140 に答える
0
String delimiter = ",";

String v = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";

String[] a = v.split(delimiter + "(?=(?:(?:[^\"]*+\"){2})*+[^\"]*+$)");
于 2015-05-06T02:13:35.047 に答える