You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取文件名中的日期作为CSV列并合并多个CSV文件?

解决方案:提取日期并合并CSV文件

你可以通过在bash中先提取日期字符串,再传递给awk处理,这样比在awk里复杂处理路径更简单可靠。同时修正表头处理和CSV结构的问题,避免column -t破坏CSV格式。

修改后的完整脚本:

#!/bin/bash

# 创建合并目录,-p避免目录已存在时报错
mkdir -p data/1.merged

# 遍历所有原始CSV文件
for i in data/0.Raw/*.csv; do
    # 从文件名提取日期:去掉路径和后缀,直接得到YYYYMMDD
    date_str=$(basename "$i" _data.csv)
    
    # 处理单个文件:给表头添加Date列,数据行添加日期作为第一列
    awk -F, -v OFS=, -v date="$date_str" '
        NR == 1 { print "Date," $0 }   # 表头新增Date列
        NR > 1  { print date "," $0 }  # 数据行前插入日期
    ' "$i" > "data/1.merged/$(basename "$i")"
done

# 合并所有处理后的文件:仅保留第一个文件的表头,跳过其余文件的表头
awk 'FNR == 1 && NR > 1 { next } 1' data/1.merged/*.csv > data/1.merged/all_files.csv

# 清理中间生成的单个文件
rm data/1.merged/*.csv

关键修改点说明:

  1. 提取日期字符串:
    用basename "$i" _data.csv直接从文件名中剥离路径和_data.csv后缀,比如data/0.Raw/20240520_data.csv会直接得到20240520,比awk正则处理更直观不易出错。

  2. 修正表头处理:
    原来的脚本没有给新增的日期列添加表头,现在在第一行(表头)前插入Date,,保证CSV结构规范,后续工具解析时能识别日期列。

  3. 移除column -t:
    column -t是用来格式化文本对齐的,但会破坏CSV的逗号分隔结构(比如遇到包含空格的字段时会错误拆分),CSV文件不需要对齐,直接输出原始逗号分隔内容即可。

  4. 合并时去重表头:
    用awk 'FNR == 1 && NR > 1 { next } 1'实现:仅保留第一个文件的表头,后续文件的表头直接跳过,避免合并后出现重复表头。

如果你执意要在awk内部处理文件名提取日期,可以用以下正则写法替换原来的FILENAME处理逻辑:

# 在awk中直接提取日期
date_str = gensub(/.*\/([0-9]{8})_data.csv/, "\\1", 1, FILENAME)

这个正则会匹配路径末尾的8位数字(YYYYMMDD)并提取出来,不过还是推荐用bash的basename更简洁。

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:09:23