多场景数据格式转换处理技术问询(Informatica/Notepad++/Unix/Oracle)
多场景处理含内嵌逗号的CSV文件解决方案
源CSV文件内容:
Cust_Id,Cust_Name,Cust_Address,Cust_Salary 1,Name1,Address,12,Road,40,10000 2,Name2,Addressline,2,15,20000
注:地址列包含内嵌逗号,常规CSV解析逻辑失效,以下为四个场景的针对性处理方案。
场景1:Informatica PowerCenter转换后写入Oracle目标表
操作步骤:
- 源配置:将平面文件定义为单字符串列(避免因地址含逗号触发错误列拆分),读取每一行完整内容。
- 转换逻辑:使用表达式转换工具,通过正则拆分字段:
Cust_Id:REGEXP_SUBSTR(INPUT_ROW, '^[^,]+', 1, 1)Cust_Name:REGEXP_SUBSTR(INPUT_ROW, '^[^,]+,[^,]+', 1, 1, ',', 2)Cust_Address:REGEXP_REPLACE(REGEXP_REPLACE(INPUT_ROW, '^[^,]+,[^,]+,', ''), ',[^,]+$', '')Cust_Salary:REGEXP_SUBSTR(INPUT_ROW, '[^,]+$', 1, 1)
- 目标配置:连接Oracle目标表,将转换后的4个字段映射到对应表列,执行写入操作。
- 最终效果:Oracle表中数据与场景4的期望输出结构一致。
场景2:Notepad++替换指定逗号为竖线(保留地址内逗号)
操作步骤:
- 打开源文件,按
Ctrl+H调出替换窗口。 - 勾选左下角「正则表达式」模式(不勾选「.匹配换行符」)。
- 处理数据行:
- 查找内容:
^(\d+),([^,]+),(.*),(\d+)$ - 替换为:
\1|\2|\3|\4 - 点击「全部替换」,完成所有数据行格式转换。
- 查找内容:
- 处理表头行:
- 查找内容:
(Cust_Name,Cust_Address),(Cust_Salary) - 替换为:
\1|\2 - 点击「替换」,修改表头格式。
- 查找内容:
- 期望输出:
Cust_Id,Cust_Name,Cust_Address|Cust_Salary 1|Name1|Address,12,Road,40|10000 2|Name2|Addressline,2,15|20000
场景3:Unix环境实现相同格式转换
方案1:awk命令(适配可变长度地址列)
awk -F ',' 'NR==1 {print $1","$2","$3"|"$4; next} { printf "%s|%s|", $1, $2; for(i=3; i<=NF-1; i++) { printf "%s%s", $i, (i==NF-1 ? "" : ","); } printf "|%s\n", $NF }' input.csv
方案2:sed正则替换(简洁高效)
sed -E '1s/(.*),(.*)$/\1|\2/; 2,$s/^([^,]+),([^,]+),(.*),([^,]+)$/\1|\2|\3|\4/' input.csv
两种方案均可输出场景2的期望格式。
场景4:Oracle查询语句拆分源数据为独立列
假设源数据存储在表CUST_SOURCE的RAW_DATA列(每行对应源文件完整行内容),执行以下查询:
SELECT REGEXP_SUBSTR(raw_data, '^[^,]+', 1, 1) AS Cust_Id, REGEXP_SUBSTR(raw_data, '^[^,]+,[^,]+', 1, 1, ',', 2) AS Cust_Name, REGEXP_REPLACE(REGEXP_REPLACE(raw_data, '^[^,]+,[^,]+,', ''), ',[^,]+$', '') AS Address, REGEXP_SUBSTR(raw_data, '[^,]+$', 1, 1) AS Salary FROM CUST_SOURCE WHERE raw_data NOT LIKE 'Cust_Id%'; -- 过滤表头行
期望输出:
| Cust_Id | Cust_Name | Address | Salary |
|---|---|---|---|
| 1 | Name1 | Address,12,Road,40 | 10000 |
| 2 | Name2 | Addressline,2,15 | 20000 |
内容的提问来源于stack exchange,提问作者Vivek Patil
相关产品推荐
相关产品推荐

