如何用AWK或其他方法修正CSV时间戳拼接,实现纳秒精度?
解决方案
思路1:补全f_timestamp2前导零至9位
用awk的sprintf格式化函数,强制将f_timestamp2(第2字段)转为9位数字,缺失部分自动补前导零。表头单独处理,数据行拼接格式化后的字段:
awk -F ',' ' BEGIN {OFS = ","} NR == 1 {print $0, "f_timestamp_nano"; next} {print $0, $1 sprintf("%09d", $2)} ' filein.csv > fileout.csv
执行后输出结果:
f_timestamp,f_timestamp2,f_date,f_timestamp_nano 1729448207,303701614,2024/10/20 19:16:47 303701614,1729448207303701614 1729415974,96090458,2024/10/20 19:16:47 096090458,1729415974096090458
思路2:转换f_date为数据库兼容格式
直接解析f_date字段,将日期分隔符从/替换为-,并把末尾的纳秒部分移到秒后用.分隔,生成YYYY-MM-DD hh:mm:ss.sssssssss格式:
awk -F ',' ' BEGIN {OFS = ","} NR == 1 {print $0, "formatted_datetime"; next} { split($3, dt, /[ ]/); split(dt[1], date, /\//); formatted_date = sprintf("%04d-%02d-%02d %s.%s", date[1], date[2], date[3], dt[2], dt[3]); print $0, formatted_date } ' filein.csv > fileout.csv
执行后输出结果:
f_timestamp,f_timestamp2,f_date,formatted_datetime 1729448207,303701614,2024/10/20 19:16:47 303701614,2024-10-20 19:16:47.303701614 1729415974,96090458,2024/10/20 19:16:47 096090458,2024-10-20 19:16:47.096090458
补充说明
- 思路1适合依赖Unix时间戳的业务场景,从根源上避免因纳秒位数不足导致的时间计算偏差;
- 思路2直接生成数据库原生支持的时间字符串格式,后续若f_date格式变动,仅需调整
split拆分规则和格式化逻辑即可快速适配。
内容的提问来源于stack exchange,提问作者Chris W
相关产品推荐
相关产品推荐

