2017-02-04 6 views
1

私はデータセットを読み込み、それを必要なデータに解析しようとしています。ファイルには、このような文字列のラインで構成されます:Rubyでデータセットを解析する

id: 1234567 synset: test,exam 

私はその後、id数とsynset単語を取得したいです。この場合、私は望みます1234567test,exam

ここに私が思いついたことがありますが、より良い方法があると確信しています。

File.open(synsets_file, "r") do |f| 
    f.each_line do |line| 
     id = line.split[1].to_i 
     nouns = line.split[3] 
     #do things with id and nouns 
    end 
end 

答えて

1

正規表現を使用してください。あなたはこの構文で一度splitを使用することができます。

File.foreach(synsets_file) do |line| 
    _, id, _, nouns = line.chomp.split(/\s+/, 4) 
    # do things with id and nouns 
end 

splitのための2番目のパラメータとして4を使用すると、内部のスペースがある場合nounsが分割されていないことを保証します。

-1

ファイルでJSON形式を使用してみてください。これは簡単です。あなたはそれではなく、ファイル全体をメモリに読み込むのforeachのようなものを使用することをお勧めし、大きなファイルを読み込むする場合

require 'json' 
file = File.read('file-name-to-be-read.json') 
data_hash = JSON.parse(file) 
puts data_hash['id'] // gives 1234567 
+1

彼が示したテキストはjson形式ではありません。 – trueinViso

+0

スペースに基づいて行を分割することができます。 'line.split(" ")'このようにして、配列を取得します。 – hvardhan

0

:次に、あなたはこのような何かを行うことができ

File.foreach(sunset_file) do |l| 
    id = l.split[1].to_i 
    nouns = l.split[3] 
    #do things with id and nouns 
end 

詳しい情報をすることができますこのSO postに見つかります。 3番目の答えは、ファイルを「スラーピング」し、なぜそれが良い考えではないのかを説明しています。

編集:answerのJSON部分を削除しました。

+0

別のファイル形式を使用するように伝えることは有用な答えではありません。 – akuhn

0

はあなたの例では、結構です

File.open(synsets_file, "r") do |f| 
    f.each_line do |line| 
     /^id: (?<id>.*) synset: (?<nouns>.*)/ =~ line.chomp 

    puts id 
    puts nouns 

    # ... 

    end 
end