这只是我的第二篇文章,我还在学习红宝石。我正试图根据我的Java知识来解决这个问题,但我似乎无法正确地理解它。
我需要做的是:我有一个函数,可以逐行读取文件,并从每一行中提取不同的car功能,例如:
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个不同的散列中。
listing = Hash.new(0)
listing = { kilometers: km, type: t, transmission: trans, drivetrain: dt, status: status, car_maker: car_maker }我尝试将数据从一个哈希转移到另一个哈希,我甚至尝试先将数据存储在数组中,然后将其移动到哈希中,但我仍然不知道如何在循环中创建单独的散列。
谢谢
发布于 2018-11-20 16:18:17
您可以利用以下事实:您的文件实例是一个可计数。这允许您利用inject方法,并且可以使用一个空的哈希来为该方法添加种子。在本例中,collector是在迭代过程中传递的散列。确保(隐式地,通过让collector作为块的最后一行)返回收集器的值,因为inject方法将使用这个值来输入下一次迭代。这是一些很有力量的东西!
我想这大概就是你想要的。我在哈希中使用model作为键,使用set_of_features作为数据。
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发布于 2018-11-20 16:26:25
希望我明白你的问题是对的。我会像下面这样做。现在,每次调用此操作时,它都会返回包含每个列表的散列。
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那么无论你在哪里使用这个,你都可以这样做。
listnings = convertListings2Catalogue("somefile.txt")
listnings.first #to get the first listing https://stackoverflow.com/questions/53396848
复制相似问题