2016-09-30 11 views
0

私は単純なtxtファイルをよく読んでいます。しかし、私はタブが尊重されていないデータ行を取得しています。ruby​​ - 行からのタブが尊重されていない

ファイル内の行の下にあります。

Anderson Silva R$10 off R$20 of food 10.0 2   987   Fake St   Batman Inc 

以下は、pryのアウトラインです。

私たちが見ることができるように、987とFake Stは同じ行にあります。

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

あなたは、このケースで貴重なinspect方法を見つけることができますタブの間にパーツの配列を含み、その配列を返します。その配列をマップすると、個々の要素にはタブが残っていない可能性があります。したがって、 'col = col.split(" \ t ")'は何を達成するはずですか?これは 'col = [col]'と事実上同じです。 – philomory

+0

また、 'puts'は' nil'を返し、 'map'ブロックの最後の式です。したがって、 'map'メソッドの戻り値は、' nil's( '[nil、nil、nil、nil、nil]'など)でいっぱいの配列になります。とにかく戻り値で何もしていないので、それは問題ではありませんが、その場合は@ordeのように 'each'を使うほうが良いでしょう。 – philomory

答えて

1

私が正しくあなたの質問を理解してるかどうかは知りませんが、私はあなたのものを期待するタブが実際には存在しないと思われると思います。

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方法が実際に供給区切り文字で分割することを示すために、あなたの文字列のサイズを縮小しました。そして、 - この場合、mapの代わりにeachを使用しました。割り当てがないからです。任意のタブに `line.split(「\ tの」)`分割ライン:私は完全にあなたの投稿コードを理解していない

line1 = "10.0\t2\t987   Fake St" 

puts line1.inspect 
#=> "10.0\t2\t987   Fake St" 
puts line1 
#=> 10.0 2  987   Fake St 
関連する問題