用StringBuilder拼装CSV行需严格遵循RFC 4180:字段含逗号、换行或双引号时须加双引号,内部双引号转义为两个双引号;提供escapeCsvField方法统一处理,并在拼接后删末尾逗号、加换行符。
用 StringBuilder 拼装 CSV 行数据,核心是正确处理字段中的逗号、换行符和双引号——不能简单用逗号连接,必须按 RFC 4180 规范转义。
CSV 中,如果字段本身包含逗号、换行(n)或双引号("),整个字段必须用双引号包裹;若字段内有双引号,需变成两个双引号("")。
张三,"北京,朝阳区" → 拼装后应为:"张三",""北京,朝阳区""
备注:他说"很好" → 转义后:"备注:他说""很好"""
每次拼接前先对单个字段做标准化处理,避免逻辑散落:
public static String escapeCsvField(String field) { if (field == null) return ""; // 先替换内部双引号为两个双引号 String escaped = field.replace(""", """"); // 如果含逗号、换行或本身带双引号,就整体加双引号 if (escaped.contains(",") || escaped.contains("n") || escaped.contains(""") || escaped.contains("r")) { return """ + escaped + """; } return escaped;}
不要在开头或结尾多加逗号,换行符放在整行末尾(不是每个字段后):
立即学习“Java免费学习笔记(深入)”;
StringBuilder sb = new StringBuilder();
escapeCsvField(),再用 sb.append(escaped).append(",");
if (sb.length() > 0) sb.setLength(sb.length() - 1);
sb.append("n");
比如拼一行用户数据:id=123, name="张三", city="北京,朝阳区", remark="他说"棒极了""
StringBuilder sb = new StringBuilder();sb.append(escapeCsvField("123")).append(",");sb.append(escapeCsvField("张三")).append(",");sb.append(escapeCsvField("北京,朝阳区")).append(",");sb.append(escapeCsvField("他说"棒极了""));if (sb.length() > 0) sb.setLength(sb.length() - 1); // 删末尾逗号sb.append("n");// 结果:"123","张三","北京,朝阳区","他说""棒极了"""
不复杂但容易忽略细节。