用StringBuilder拼装CSV行需严格遵循RFC 4180:字段含逗号、换行或双引号时须加双引号,内部双引号转义为两个双引号;提供escapeCsvField方法统一处理,并在拼接后删末尾逗号、加换行符。

用 StringBuilder 拼装 CSV 行数据,核心是正确处理字段中的逗号、换行符和双引号——不能简单用逗号连接,必须按 RFC 4180 规范转义。
字段内容含特殊字符时必须加双引号并转义
CSV 中,如果字段本身包含逗号、换行(\n)或双引号("),整个字段必须用双引号包裹;若字段内有双引号,需变成两个双引号("")。
- 原始字段:
张三,"北京,朝阳区"→ 拼装后应为:"张三",""北京,朝阳区"" - 原始字段:
备注:他说"很好"→ 转义后:"备注:他说""很好"""
推荐封装一个安全的 CSV 字段转义方法
每次拼接前先对单个字段做标准化处理,避免逻辑散落:
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;
}用 StringBuilder 逐字段拼接,注意逗号和换行位置
不要在开头或结尾多加逗号,换行符放在整行末尾(不是每个字段后):
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
立即学习“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","张三","北京,朝阳区","他说""棒极了"""
不复杂但容易忽略细节。

















