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

Ruby:将指定CSV文件列中的日期转换为仅保留四位年份

嘿,这个需求很清晰,用Ruby内置的CSV标准库就能轻松搞定!我给你写个完整的实现,还会解释关键部分,确保你能适配自己的场景。

解决方案

核心思路是:遍历CSV的每一行数据,跳过birthdate列保留原始格式,对其他符合日期格式的列提取四位年份。

完整代码实现

require 'csv'

# 替换成你的输入输出文件路径
INPUT_CSV = 'input.csv'
OUTPUT_CSV = 'output.csv'

# 从带引号的日期字符串中提取四位年份
def extract_year(date_string)
  # 移除字符串两端的引号,按斜杠分割后取最后一段(年份)
  date_string.delete('"').split('/').last
end

# 处理CSV文件
CSV.open(OUTPUT_CSV, 'w', headers: true) do |output|
  CSV.foreach(INPUT_CSV, headers: true) do |row|
    row.each do |column_name, value|
      # 跳过birthdate列,保留原始格式
      next if column_name == 'birthdate'
      
      # 判断是否为MM/DD/YYYY格式的日期(简单正则匹配)
      if value =~ /^\d+\/\d+\/\d{4}$/
        row[column_name] = extract_year(value)
      end
    end
    # 将处理后的行写入输出文件
    output << row
  end
end

代码解释

  • 依赖引入:Ruby的CSV是标准库,不需要额外安装gem,直接require 'csv'即可使用。
  • 年份提取方法:extract_year先移除日期字符串的双引号(匹配你CSV里日期被引号包裹的格式),然后用斜杠分割字符串,取最后一段就是四位年份。这个方法对MM/DD/YYYY和DD/MM/YYYY格式都有效,因为年份始终在最后。
  • CSV处理逻辑:
    1. 打开输出CSV文件,设置headers: true来保留表头结构。
    2. 遍历输入CSV的每一行,获取带表头的行对象,方便按列名操作。
    3. 对每一列进行判断:如果是birthdate列直接跳过;否则检查值是否符合日期格式,符合则替换为年份。
    4. 将处理后的行写入输出文件。

测试结果

用你提供的示例CSV运行代码后,输出的CSV内容会是:

name,birthdate,color,year1,fruit,year2
Joe,"1/1/1950",red,1989,banana,2003
Joan,"2/4/2007",blue,2010,peach,2018
John,"3/22/1979",yellow,2009,plum,2000

完全符合你的需求:birthdate列保留原始格式,其他日期列只保留四位年份。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:11:15