红宝石 - 从行不尊重标签

问题描述:

我正在阅读一个简单的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 
+1

我不知道我完全理解你的代码发布:在任何标签'line.split(“\ t”的)'分割线它包含并返回选项卡之间的部分数组。然后,当你映射到该数组时,单个元素不可能在其中留下任何选项卡,那么'col = col.split(“\ t”)'应该完成什么?它实际上与col = [col]相同。 – philomory

+0

'puts'返回'nil',它是'map'块中的最后一个表达式。因此,在这种情况下'map'方法的返回值将是一个包含'nil'的数组(例如'[nil,nil,nil,nil,nil]')。当然,无论如何你都没有对返回值做任何事情,所以它并不重要,但在这种情况下,你最好使用'each'作为@orde。 – philomory

我不知道如果我正确理解你的问题,但我怀疑,实际上有没有,你想到一个标签。

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