首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ruby中将数据移动到3个单独的散列内循环。

在ruby中将数据移动到3个单独的散列内循环。
EN

Stack Overflow用户
提问于 2018-11-20 15:56:53
回答 2查看 159关注 0票数 0

这只是我的第二篇文章,我还在学习红宝石。我正试图根据我的Java知识来解决这个问题,但我似乎无法正确地理解它。

我需要做的是:我有一个函数,可以逐行读取文件,并从每一行中提取不同的car功能,例如:

代码语言:javascript
复制
def convertListings2Catalogue (fileName)

f = File.open(fileName, "r")
f.each_line do |line|

  km=line[/[0-9]+km/]
  t = line[(Regexp.union(/sedan/i, /coupe/i, /hatchback/i, /station/i, /suv/i))]
  trans = ....
end end

现在,对于每一行,我需要将提取的特性存储到单独的散列中,我可以在以后的程序中访问这些哈希。 我面临的问题是: 1)我正在覆盖相同散列中的特性,2)无法访问函数之外的哈希

我的档案里有:

651公里,轿车,手册,2010年,18131A,FWD,使用,5.5L/100公里,丰田,凯美瑞,东南,{AC,加热座椅,加热镜,无键进入} 轿车,1100公里,汽车,RWD,Mercedec,CLK,LX ,18FO724A,2017,{AC,加热座椅,加热镜,无键入口,电源座椅},6L/100公里,使用 AWD,SUV,0km,汽车,新,本田,CRV,8L/100公里,{加热座椅,加热镜,无键进入},19BF723A,2018,LE

现在我的函数提取每个汽车模型的特征,但是我需要用相同的键和不同的值将这些特性存储在3个不同的散列中。

代码语言:javascript
复制
listing = Hash.new(0)
  listing = { kilometers: km, type: t, transmission: trans, drivetrain: dt, status: status, car_maker: car_maker }

我尝试将数据从一个哈希转移到另一个哈希,我甚至尝试先将数据存储在数组中,然后将其移动到哈希中,但我仍然不知道如何在循环中创建单独的散列。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-11-20 16:18:17

您可以利用以下事实:您的文件实例是一个可计数。这允许您利用inject方法,并且可以使用一个空的哈希来为该方法添加种子。在本例中,collector是在迭代过程中传递的散列。确保(隐式地,通过让collector作为块的最后一行)返回收集器的值,因为inject方法将使用这个值来输入下一次迭代。这是一些很有力量的东西!

我想这大概就是你想要的。我在哈希中使用model作为键,使用set_of_features作为数据。

代码语言:javascript
复制
def convertListings2Catalogue (fileName)
  f = File.open(fileName, "r")

  my_hash = f.inject({}) do |collector, line|
    km=line[/[0-9]+km/]
    t = line[(Regexp.union(/sedan/i, /coupe/i, /hatchback/i, /station/i, /suv/i))]
    trans = line[(Regexp.union(/auto/i, /manual/i, /steptronic/i))]
    dt = line[(Regexp.union(/fwd/i, /rwd/i, /awd/i))]
    status = line[(Regexp.union(/used/i, /new/i))]
    car_maker = line[(Regexp.union(/honda/i, /toyota/i, /mercedes/i, /bmw/i, /lexus/i))]  
    stock = line.scan(/(\d+[a-z0-9]+[a-z](?<!km\b))(?:,|$)/i).first
    year = line.scan(/(\d{4}(?<!km\b))(?:,|$)/).first
    trim = line.scan(/\b[a-zA-Z]{2}\b/).first
    fuel = line.scan(/[\d.]+L\/\d*km/).first
    set_of_features = line.scan(/\{(.*?)\}/).first
    model = line[(Regexp.union(/camry/i, /clk/i, /crv/i))]
    collector[model] = set_of_features
    collector
  end
end
票数 0
EN

Stack Overflow用户

发布于 2018-11-20 16:26:25

希望我明白你的问题是对的。我会像下面这样做。现在,每次调用此操作时,它都会返回包含每个列表的散列。

代码语言:javascript
复制
    def convertListings2Catalogue (fileName)
      listings = []

      f = File.open(fileName, "r")
      f.each_line do |line|

        km=line[/[0-9]+km/]
        t = line[(Regexp.union(/sedan/i, /coupe/i, /hatchback/i, /station/i, /suv/i))]
        trans = line[(Regexp.union(/auto/i, /manual/i, /steptronic/i))]
        dt = line[(Regexp.union(/fwd/i, /rwd/i, /awd/i))]
        status = line[(Regexp.union(/used/i, /new/i))]
        car_maker = line[(Regexp.union(/honda/i, /toyota/i, /mercedes/i, /bmw/i, /lexus/i))]  
        stock = line.scan(/(\d+[a-z0-9]+[a-z](?<!km\b))(?:,|$)/i).first
        year = line.scan(/(\d{4}(?<!km\b))(?:,|$)/).first
        trim = line.scan(/\b[a-zA-Z]{2}\b/).first
        fuel = line.scan(/[\d.]+L\/\d*km/).first
        set_of_features = line.scan(/\{(.*?)\}/).first
        model = line[(Regexp.union(/camry/i, /clk/i, /crv/i))]

        listing = { kilometers: km, type: t, transmission: trans, drivetrain: dt, status: status, car_maker: car_maker }

        listings.push listing

        return listings
      end 
    end

那么无论你在哪里使用这个,你都可以这样做。

代码语言:javascript
复制
listnings = convertListings2Catalogue("somefile.txt")
listnings.first #to get the first listing 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53396848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档