如何使用正则表达式在csv文件中查找日期并[使用Ruby]存储在数组中?
我将数据存储在csv文件中,如下所示:如何使用正则表达式在csv文件中查找日期并[使用Ruby]存储在数组中?,ruby,regex,arrays,csv,Ruby,Regex,Arrays,Csv,我将数据存储在csv文件中,如下所示: Date,BLOCK,,Wood,Miscellaneous,,Totals,MO Saturday,4055-RU,4055-AR,4091,1139,1158,,100 11/13/15,C Sort,B,C,iGPS,PECO,, Starting,758,"3,936",840,0,0,"5,534", Sorted,656,736,540,162,64,"2,158", Subtotal 1,"1,414","4,672","1,380",162
Date,BLOCK,,Wood,Miscellaneous,,Totals,MO
Saturday,4055-RU,4055-AR,4091,1139,1158,,100
11/13/15,C Sort,B,C,iGPS,PECO,,
Starting,758,"3,936",840,0,0,"5,534",
Sorted,656,736,540,162,64,"2,158",
Subtotal 1,"1,414","4,672","1,380",162,64,"7,692",
Shipped,0,"1,152",620,162,64,"1,898",
,"1,414","3,520",860,0,0,"5,794",
Physical,"1,414","3,520",860,0,0,"5,794",
Variance,0,0,0,0,0,0,
Date,BLOCK,,Wood,Miscellaneous,,Totals,MO
Saturday,4055-RU,4055-AR,4091,1139,1158,,100
11/14/15,C Sort,B,C,iGPS,PECO,,
Starting,758,"3,936",840,0,0,"5,534",
Sorted,656,736,540,162,64,"2,158",
Subtotal 1,"1,414","4,672","1,380",162,64,"7,692"
Shipped,0,"1,152",620,162,64,"1,898"
,"1,414","3,520",860,0,0,"5,794"
Physical,"1,414","3,520",860,0,0,"5,794"
Variance,0,0,0,0,0,0
我需要创建一个包含所有提到的日期的数组(在本例中,日期=['11/13/15','11/14/15']
我相信可以使用正则表达式提取这些信息,但我真的不明白它们是如何工作的/如何进行的。那么,我如何提取日期呢
编辑:我可以使用CSV.foreach按行对数据进行排序,但我遇到的麻烦是告诉程序提取与日期格式(即11/13/15)匹配的任何内容。这对我的问题更有意义吗
谢谢大家!!
-肖恩您可以通过以下方法得到一级近似值:
dates = CSV.open('x.csv').map{|r| r.select { |x| x =~ /\d\d\/\d\d\/\d\d/ } }.flatten
然后,如果需要,扫描日期的元素,以确保数字在正确的范围内(这样您就不会意外地包含声称为2001年2月31日的日期)。如果要检查格式,可以使用并捕获错误:
clean = dates.select do |d|
begin
# I'm guessing on the date format.
DateTime.strptime(d, '%m/%d/%y')
rescue ArgumentError
nil
end
end
您可以通过以下方法获得一级近似值:
dates = CSV.open('x.csv').map{|r| r.select { |x| x =~ /\d\d\/\d\d\/\d\d/ } }.flatten
然后,如果需要,扫描日期的元素,以确保数字在正确的范围内(这样您就不会意外地包含声称为2001年2月31日的日期)。如果要检查格式,可以使用并捕获错误:
clean = dates.select do |d|
begin
# I'm guessing on the date format.
DateTime.strptime(d, '%m/%d/%y')
rescue ArgumentError
nil
end
end
顺便说一句,我相信有人可以把它写成一行,但对于Ruby新手来说,这可能更容易理解
我作出以下假设:
- 所有日期的格式均为mm/dd/yy
- 数组中所需的所有日期都位于每行的开头
- 您不需要验证它是否为有效日期
顺便说一句,我相信有人可以把它写成一行,但对于Ruby新手来说,这可能更容易理解
我作出以下假设:
- 所有日期的格式均为mm/dd/yy
- 数组中所需的所有日期都位于每行的开头
- 您不需要验证它是否为有效日期
正确的一个衬里是:
File.open('yourfile.csv').read.scan /\d{2}\/\d{2}\/\d{2}/
顺便说一下\d{2}比\d\d好得多,原因如下:
- 您可以看到2.\d{2}读起来像“2位数字”(一旦
(习惯了)
- 如果要将其更改为1或2位,可以执行{1,2}
正确的一个衬里是:
File.open('yourfile.csv').read.scan /\d{2}\/\d{2}\/\d{2}/
顺便说一下\d{2}比\d\d好得多,原因如下:
- 您可以看到2.\d{2}读起来像“2位数字”(一旦
(习惯了)
- 如果要将其更改为1或2位,可以执行{1,2}
我认为使用现有的CSV解析器要比使用复杂、不可读且不完整的正则表达式容易得多。我不使用Ruby,但我相信会有很多现有的CSV解析器能够很好地完成这项工作。看起来Ruby附带了一个CSV模块,也许你可以使用它。Ruby有一个CSV解析器。我如果没有,我会感到羞愧。我认为使用现有的CSV解析器比使用复杂、不可读和不完整的正则表达式要容易得多。我不使用Ruby,但我相信会有很多现有的CSV解析器很好地完成这项工作。看起来Ruby附带了一个CSV模块,也许你可以使用它。Ruby有一个CSV解析器。如果没有,我会感到羞耻。啊,有人在我输入答案之前就已经把它写成了一行。啊,有人在我输入答案之前就已经把它写成了一行。这正是我想要的,但我想不出来!谢谢!对不起,穆,我不是有意暗示你是incorrect,只是它可以更简洁。这正是我想要的,但无法理解!谢谢!对不起,mu,我不是想暗示你不正确,只是它可以更简洁。这更容易阅读。出于好奇,为什么要使用File.open而不是CSV。open?File.read将整个内容放入字符串中。CSV构建数组。这更容易阅读。出于好奇,为什么要使用File.open而不是CSV.open?File.read将整个内容放入字符串中。CSV构建数组。