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处理逻辑:
- 打开输出CSV文件,设置
headers: true来保留表头结构。 - 遍历输入CSV的每一行,获取带表头的行对象,方便按列名操作。
- 对每一列进行判断:如果是
birthdate列直接跳过;否则检查值是否符合日期格式,符合则替换为年份。 - 将处理后的行写入输出文件。
- 打开输出CSV文件,设置
测试结果
用你提供的示例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
相关产品推荐
相关产品推荐

