使用PySpark读取CSV时,末尾引号前反斜杠的解析问题
CSV解析问题:兼容Excel的转义规则处理
原始CSV内容
DoctorName, Description, Salary "Dr. Jason BAH\","",138.42200000000000000000 "Dr. \"Sleep\" MAH","",200.42200000000000000000
当前读取配置(Spark)
option("quote", '"').option("multiline", True).option("header", True).option("escape", "\\")
错误解析结果
| DoctorName | Description | Salary |
|---|---|---|
| Dr. Jason BAH"","" | 138.422 | null |
| Dr. "Sleep" MAH | null | 200.422 |
期望解析结果
| DoctorName | Description | Salary |
|---|---|---|
| Dr. Jason BAH\ | null | 138.422 |
| Dr. "Sleep" MAH | null | 200.422 |
参数分析与解决方案
当前参数问题
你设置的escape="\\"是错误的:这个参数会让Spark把反斜杠当作转义字符,导致第一行中\"被解析为单个双引号,而非保留反斜加拉引号的原始内容。此时Spark会误判第一个字段的闭合位置,将后续的","也纳入DoctorName字段,最终造成列错位。
而Excel采用CSV的传统兼容规则:
- 仅用连续两个双引号表示字段内部的单个双引号
- 反斜杠被视为普通字符,不需要作为转义符
解决步骤
- 移除
escape参数:让Spark不再将反斜杠当作转义字符,而是作为普通内容保留 - 保留其他必要参数:维持
quote='"'(双引号作为字段包围符)、header=True、multiline=True(若有跨行字段需求)
调整后的读取配置:
option("quote", '"').option("multiline", True).option("header", True)
补充说明
如果CSV中存在字段内部的双引号(比如第二行的"Sleep"),标准CSV格式应该用连续两个双引号表示(即"Dr. ""Sleep"" MAH"),这样Excel和Spark都能正常解析。如果原始文件中是\"格式,这其实不符合标准CSV规范,Excel能解析是因为做了容错处理,此时你可能需要先预处理CSV内容,将\"替换为""后再读取。
内容的提问来源于stack exchange,提问作者João Miguens
相关产品推荐
相关产品推荐

