所以我有一个看起来像这样的CSV;
This is a test file
,,,,,,,,,,,
1122,Foo,Bar,FooBar
22321,Bar,Bar,Foo
11223,Foo,Foo,Foo,,,,,,,,,
12312/2423/1245,Foo,Foo,,,,,,,,
我想解析它并在我的数组中得到以下结果;
1122,Foo,Bar,FooBar
11223,Foo,Foo,Foo
22321,Bar,Bar,Foo
12312/2423/1245,Foo,Foo
我的代码;
class ReadCSVToArray
def initialize(file)
@array = CSV.read(file)
end
def compact_multi
y = []
@array.each { |i| i.compact! ; y << i unless i.blank? }
end
def item_rows
y = []
@array.each { |o|
if o[0].include? '/'; y << o ; end
if o[0].is_number? ; y << o ; end
}
end
end
the_list = ReadCSVToArray.new('/Users/davidteren/Desktop/read_test.csv')
the_list.compact_multi.item_rows.sort.each { |i| p i }
因此,如上所述,我想链接几种方法来获得我的结果。
我尝试了各种各样的事情;
class ReadCSVToArray
def initialize(file)
@array = CSV.read(file)
end
def compact_multi
y = []
@array.each { |i| i.compact! ; y << i unless i.blank? }
self
end
def item_rows
y = []
@array.each { |o|
if o[0].include? '/'; y << o ; end
if o[0].is_number? ; y << o ; end
}
self
end
end
无论我尝试什么,我都无法让它发挥作用。
答案 0 :(得分:1)
这条线存在问题:
the_list.compact_multi.item_rows.sort.each { |i| p i }
这个链分解为4个方法调用:
the_list.compact_multi
the_list.item_rows
the_list.sort
the_list.each { |i| p i }
通过在self
和compact_multi
方法中返回item_rows
,您可以确保将链中的下一个方法发送到ReadCSVToArray
实例。但是没有ReadCVSToArray#sort
或ReadCSVToArray#each
方法。您可能希望在实例变量@array
上调用它们。
答案 1 :(得分:0)
result = CSV.parse 'This is a test file
,,,,,,,,,,,
1122,Foo,Bar,FooBar
22321,Bar,Bar,Foo
11223,Foo,Foo,Foo,,,,,,,,,
12312/2423/1245,Foo,Foo,,,,,,,,'
result.map(&:compact).reject { |l| l.size < 2 }
#⇒ [["1122", "Foo", "Bar", "FooBar"], ["22321", "Bar", "Bar", "Foo"],
# ["11223", "Foo", "Foo", "Foo"], ["12312/2423/1245", "Foo", "Foo"]]
请注意,拒绝清空可能应该更加准确。希望它有所帮助。
要得到这个:
the_list.compact_multi.item_rows.sort.each { |i| p i }
开始工作,compact_multi
应该返回self
而item_rows
应该返回@array
。
答案 2 :(得分:0)
您似乎有两个问题,方法链接并获得正确的结果......
您的正确结果问题似乎是您正在分配和构建此y
数组,但您在任何这些方法中都没有对其进行任何操作...
def compact_multi
y = []
@array.each { |i| i.compact! ; y << i unless i.blank? }
self
end
def item_rows
y = []
@array.each { |o|
if o[0].include? '/'; y << o ; end
if o[0].is_number? ; y << o ; end
}
self
end
你的目标究竟是什么?如果要通过y
数组维护结果,那么将其作为实例变量并在initialize
方法中初始化...
就您的链接方法问题而言,如果我认为您正在尝试做的事情,您的问题尚不清楚,那么您的方法应该是这样的......
class ReadCSVToArray
def initialize(file)
@result = []
@csv = CSV.read(file)
end
def compact_multi
@csv.each { |i| i.compact! ; @result << i unless i.blank? }
self
end
def item_rows
@csv.each { |o|
if o[0].include? '/'; @result << o ; end
if o[0].is_number? ; @result << o ; end
}
@result
end
end