私は以下のような文字列を持っています -
値1、値2、値3、値4、「値5、1234」、値6、値7、「値8」、値9、「値10、123.23」
上記の文字列をトークン化すると、カンマ区切りのトークンが得られます。しかし、文字列トークナイザーは、分割中に二重引用符の後のコンマを無視するように言いたいです。どうすればこれを言うことができますか?
前もって感謝します
シャシ
必要なのは、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
私は正規表現にアレルギーがあります。誰かが提案したように、なぜ二重に分割しないのですか?
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;
}
サードパーティのライブラリに依存しない場合、次のコードは、指定された要件に従ってフィールドを解析することもできます。
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
String delimiter = ",";
String v = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";
String[] a = v.split(delimiter + "(?=(?:(?:[^\"]*+\"){2})*+[^\"]*+$)");