动态Schema下移除特殊字符:含逗号的引号包裹源数据加载至目标表方案
实现方案
方案1:Python 实现(适合本地/脚本处理场景)
核心依赖csv模块自带的引号识别能力,自动跳过包裹在引号内的逗号分隔符,避免手动拆分出错
import csv # 读取源文件,指定单引号为字段包裹符 with open('source.csv', 'r', newline='', encoding='utf-8') as f: reader = csv.reader(f, delimiter=',', quotechar="'") # 去除字段多余单引号后用|拼接 result = [ '|'.join([field.strip("'") for field in row]) for row in reader ] # 写入目标格式文件 with open('target.csv', 'w', encoding='utf-8') as f: f.write('Col1|Col2|Col3\n') f.write('\n'.join(result))
方案2:Spark SQL 实现(适合大数据数仓加载场景)
如果已经把源数据读为单字符串列,可直接用正则拆分处理:
-- 原始单列表名为raw_data,表名source_tbl SELECT split(raw_data, ",'(?=.)|(?<=.),'")[0] as Col1, replace(split(raw_data, ",'(?=.)|(?<=.),'")[1], "'", "") as Col2, split(raw_data, ",'(?=.)|(?<=.),'")[2] as Col3 FROM source_tbl
如果是直接读取源文件,可直接通过csv读取参数自动处理:
CREATE TABLE target_tbl ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim' = '|', 'serialization.format' = '|' ) AS SELECT _c0 as Col1, _c1 as Col2, _c2 as Col3 FROM csv.`源文件路径` OPTIONS ( 'sep' = ',', 'quote' = '\'', -- 指定单引号为字段包裹符,自动忽略包裹内的逗号 'escape' = '\'' -- 适配两个单引号的转义规则 )
方案3:Shell 命令实现(适合轻量服务器端快速处理)
awk -F ",'" 'BEGIN{OFS="|"}{gsub(/'\''/,"",$2);print $1,$2,$3}' source.csv | sed '1i Col1|Col2|Col3' > target.csv
内容的提问来源于stack exchange,提问作者user3616159
相关产品推荐
相关产品推荐

