Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正则表达式在csv文件中查找日期并[使用Ruby]存储在数组中?_Ruby_Regex_Arrays_Csv - Fatal编程技术网

如何使用正则表达式在csv文件中查找日期并[使用Ruby]存储在数组中?

如何使用正则表达式在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

我将数据存储在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,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构建数组。