红宝石 - 从行不尊重标签
问题描述:
我正在阅读一个简单的txt文件很好。不过,我得到的数据行与选项卡不尊重。红宝石 - 从行不尊重标签
在文件的下方。
Anderson Silva R$10 off R$20 of food 10.0 2 987 Fake St Batman Inc
下面是pry的外线。
正如我们所看到的987和假圣在一起在同一行。
Anderson Silva
R$10 off R$20 of food
10.0
2
987 Fake St
Batman Inc
这里的简单代码
line.split("\t").map do |col|
col = col.split("\t")
puts col
end
答
我不知道如果我正确理解你的问题,但我怀疑,实际上有没有,你想到一个标签。
def contrived_method(str)
str.split("\t").each do |col|
col = col.split("\t")
puts col
end
end
line1 = "10.0\t2\t987 Fake St"
line2 = "10.0\t2\t987\tFake St"
contrived_method(line1)
#=> 10.0
#=> 2
#=> 987 Fake St
contrived_method(line2)
#=> 10.0
#=> 2
#=> 987
#=> Fake St
出于演示,我已经减少了你的字符串的大小,以表明String::split
方法确实会分裂所提供的分隔符。而且 - 在这种情况下 - 我使用each
而不是map
,因为没有分配。
你会找到inspect
方法在这种情况下是有价值的:
line1 = "10.0\t2\t987 Fake St"
puts line1.inspect
#=> "10.0\t2\t987 Fake St"
puts line1
#=> 10.0 2 987 Fake St
我不知道我完全理解你的代码发布:在任何标签'line.split(“\ t”的)'分割线它包含并返回选项卡之间的部分数组。然后,当你映射到该数组时,单个元素不可能在其中留下任何选项卡,那么'col = col.split(“\ t”)'应该完成什么?它实际上与col = [col]相同。 – philomory
'puts'返回'nil',它是'map'块中的最后一个表达式。因此,在这种情况下'map'方法的返回值将是一个包含'nil'的数组(例如'[nil,nil,nil,nil,nil]')。当然,无论如何你都没有对返回值做任何事情,所以它并不重要,但在这种情况下,你最好使用'each'作为@orde。 – philomory