如何移除CSV双引号字段内的逗号及解决MySQL导入CSV问题
解决CSV引号内逗号移除及MySQL导入问题
一、移除CSV双引号字段内的所有逗号
你之前的sed命令只能处理单个逗号,是因为全局替换只会在单次遍历行时替换一处匹配的逗号,没法循环处理同一个引号对里的多个逗号。这里给你两个可靠的解决方案:
1. 改进版sed命令(循环处理)
可以用sed的标签和跳转命令,循环执行替换直到所有引号内的逗号都被移除:
sed ':loop; s/"\([^"]*\),\([^"]*\)"/\1\2/g; t loop' file.csv > cleaned_file.csv
:loop定义一个循环标签s/"\([^"]*\),\([^"]*\)"/\1\2/g每次替换引号内的一个逗号t loop如果替换成功,就跳回loop标签继续执行,直到没有逗号可替换为止
2. 更可靠的awk脚本
sed处理这种需要状态跟踪的场景不如awk灵活,这个awk脚本会逐字符检查是否处于双引号内,只移除引号内的逗号:
awk '{ in_quote = 0 for (i=1; i<=length($0); i++) { c = substr($0, i, 1) if (c == "\"") { in_quote = !in_quote # 切换引号内的状态 printf "%s", c } else if (c == "," && in_quote) { continue # 引号内的逗号跳过不输出 } else { printf "%s", c } } printf "\n" }' file.csv > cleaned_file.csv
这个脚本不管引号内有多少逗号,都能全部移除,而且不会影响引号外的分隔逗号,即使一行有多个带引号的字段也能正确处理。
二、MySQL OPTIONALLY ENCLOSED BY '"' 不生效的排查
Excel导出的CSV只有含逗号的字段加引号,这种情况OPTIONALLY ENCLOSED BY '"'应该是能正常识别的,可能是这些细节出了问题:
1. 检查LOAD DATA命令格式
确保你的命令完整且正确,比如:
LOAD DATA INFILE '/path/to/your/file.csv' INTO TABLE your_target_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' -- 如果CSV有表头,加上下面这行 IGNORE 1 LINES;
2. 处理分隔符后的空格
你的例子里有, 900这种逗号加空格的情况,MySQL默认严格匹配TERMINATED BY ',',这时候空格会被当作字段内容的一部分,导致列错位。可以两种方式解决:
- 导出CSV时去掉逗号后的空格(Excel导出时可以调整设置)
- 导入时用
TRIM()函数清理字段:LOAD DATA INFILE '/path/to/file.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10) SET col1 = TRIM(@col1), col2 = TRIM(@col2), -- 其他列同理 col10 = TRIM(@col10);
3. 换行符问题
如果是Windows下导出的CSV,换行符是\r\n而不是\n,需要在命令里指定:
LINES TERMINATED BY '\r\n'
4. 未闭合的引号或转义问题
如果CSV里有未闭合的双引号,或者字段内的引号没有正确转义(Excel应该会把字段内的"转成""),也会导致MySQL无法正确识别引号包围的字段,需要检查CSV的格式是否规范。
内容的提问来源于stack exchange,提问作者mas
相关产品推荐
相关产品推荐

