2017-04-04 6 views
0

行テキストファイルから読み込む分割する方法私はそれぞれの行は次のようにフォーマットされたテキストファイルの各行を読み込むしようとしている

Bob,Daniels,40,50,60,70,80 

は私がに基づいて、各ラインの内容を分割したいです私はここで間違って何をやっている

f = File.open("textfile.txt", "r") 
f.each_line do |line| 
    line.split(",") 
end 

または私はこれを行うことができ、より良い方法がある:私はこれを行うときにコンマが、何らかの理由でそれが動作しないのですか?

+0

あなたのプログラムには何も出力されないので、あなたは何を期待するのか分かりません。 [mcve]と問題のより良い説明を記入してください。 –

+0

コンマ区切り値(CSV)ファイルを読み込んでいます。既存の[CSV](https://ruby-doc.org/stdlib-2.4.1/libdoc/csv/rdoc/CSV.html)クラスを使用してください。 CSVファイルはシンプルに見えますが、シンプルで素朴な 'split'が処理できない特殊なケースがいくつかあります。 –

答えて

0

あなたは、分割の結果を保存する例として、変数に保存する必要があります

result = [] 
f = File.open("textfile.txt", "r") 
f.each_line {|line| result << line.split(",") } 
0

出力カンマ区切りのファイルからの最後の名前フィールド:

プログラム

f.each_line do |line| 
    fields = line.split(",") 
    puts fields[1] 
end 

入力(テキストファイル.txt)

Bob,Daniels,40,50,60,70,80 
John,Smith,40,50,60,70,80 

出力

Daniels 
Smith 
1

あなたはCSV( "カンマ区切り")ファイルを読み込むため、既存のCSVクラスを使用しています。 CSVファイルには、ナイーブなsplitが処理できない特殊なケースがたくさんあります。

ドキュメントには、ファイルや文字列の読み書き方法に関するさまざまな例があります。ファイルから一度にラインを読み取るためのthe documentationから例えば

、:あなたのコードで

CSV.foreach("path/to/file.csv") do |row| 
    # use row here... 
end 

問題がある:ファイルオーバー

f.each_line do |line| 
    line.split(",") 
end 

each_line反復しますeachブロックを使用して読み取られます。

line.split(",") 

は値を分割しますが、何もしませんので、結果は破棄されます。あなたは結果を変数に割り当てるか、結果の配列を反復処理することができます:

foo = line.split(",") 
# do something with foo 

か:

line.split(",").each do |i| 
    # do something with i 
end 

しかし、再び、CSVの仕様はとてもsplitに頼る前によく考えて簡単ではありません。たとえば、次の行は有効なCSVです:

this,"is,some,CSV",data 

として解析される必要があります:それは間違っているので、そこに、

​​

をして:誤って生成します

["this", "is,some,CSV", "data"] 

けどsplit(",")余分なクリーンアップが必要になります。

splitは、カンマ区切りの値の単純なセットでは安全と思われるので、上記のような状況に陥るまですべてが安全だと思うようになります。

関連する問題