KSH中转换CSV日期格式解决PostgreSQL导入Timestamp报错
解决CSV日期格式适配PostgreSQL Timestamp的问题
问题根源
你的awk命令失效核心原因是shell转义干扰:用双引号包裹awk脚本时,KSH会将\1这类awk后向引用当作shell转义字符处理,导致awk无法正确识别分组匹配结果。
修正后的awk处理命令
用单引号包裹整个awk脚本,避免shell转义,同时确保正则精准匹配14位日期字符串:
awk 'BEGIN {FS=OFS=","} {gsub(/^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{6})$/, "\\1\\2\\3 \\4", $1)} 1' input_file.csv > output_file.csv
如果要严格按照年-月-日-时-分-秒的分组拆分(和你最初的逻辑一致),可以用这个版本:
awk 'BEGIN {FS=OFS=","} {gsub(/^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})$/, "\\1\\2\\3 \\4\\5\\6", $1)} 1' input_file.csv > output_file.csv
关键细节说明
- 单引号包裹awk脚本:彻底避免KSH解析awk专属的后向引用符号
\\1:在单引号环境中,需要用双反斜杠表示awk的分组引用(单引号内shell不会转义反斜杠)FS=OFS=",":确保CSV的逗号分隔符在读写时保持一致,避免破坏CSV结构- 末尾的
1:awk的简写语法,代表打印处理后的当前行
更高效的备选方案(无需修改原始CSV)
如果不想修改原始CSV文件,可以直接在PostgreSQL导入流程中完成格式转换,步骤如下:
- 创建临时表承接原始CSV数据:
CREATE TEMP TABLE temp_import AS SELECT * FROM your_target_table LIMIT 0;
- 用
\copy导入原始CSV到临时表:
\copy temp_import FROM 'input_file.csv' WITH (FORMAT csv, DELIMITER ',');
- 转换日期格式后插入目标表:
INSERT INTO your_target_table(col1, col2, timestamp_column, ...) SELECT col1, col2, TO_TIMESTAMP(timestamp_column, 'YYYYMMDDHH24MISS'), ... FROM temp_import;
- 清理临时表:
DROP TABLE temp_import;
内容的提问来源于stack exchange,提问作者adarsh1699
相关产品推荐
相关产品推荐

