关于Java String Manipulation

Ara*_*rav 2 java string replaceall

我在split命令之后将字符串"MO""RET"存储在items[1]数组中.在它存储之后,我在这个字符串上做一个替换,它取代了所有的双引号.但我希望它存储为MO"RET.我该怎么做.在我使用split命令处理的csv文件中重复文本字段内容中的双引号(例如:此帐户是""large""一个").所以我想保留字符串中间的两个引号之一,如果它如果存在则重复并忽略最终引号.我该怎么做?

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
items[1] has "MO""RET"
String recordType = items[1].replaceAll("\"","");
Run Code Online (Sandbox Code Playgroud)

在这个rec​​ordType之后MORET 我希望它有MO"RET

Bal*_*usC 6

不要使用正则表达式来拆分CSV行.这是在寻找麻烦;)只是逐个字符地解析它.这是一个例子:

public static List<List<String>> parseCsv(InputStream input, char separator) throws IOException {
    BufferedReader reader = null;
    List<List<String>> csv = new ArrayList<List<String>>();
    try {
        reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
        for (String record; (record = reader.readLine()) != null;) {
            boolean quoted = false;
            StringBuilder fieldBuilder = new StringBuilder();
            List<String> fields = new ArrayList<String>();
            for (int i = 0; i < record.length(); i++) {
                char c = record.charAt(i);
                fieldBuilder.append(c);
                if (c == '"') {
                    quoted = !quoted;
                }
                if ((!quoted && c == separator) || i + 1 == record.length()) {
                    fields.add(fieldBuilder.toString().replaceAll(separator + "$", "")
                        .replaceAll("^\"|\"$", "").replace("\"\"", "\"").trim());
                    fieldBuilder = new StringBuilder();
                }
                if (c == separator && i + 1 == record.length()) {
                    fields.add("");
                }
            }
            csv.add(fields);
        }
    } finally {
        if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
    }
    return csv;
}
Run Code Online (Sandbox Code Playgroud)

是的,涉及的正则表达式很少,但它只会修剪结束分隔符和单个字段的周围引号.

但是,您也可以使用任何第三方Java CSV API.