2016-06-20 10 views
1

Rubyで単純なCSVファイルを開き、特定のキーを見つけて値を1つ増やしてから、再度保存しようとしています。CSVファイルを開き、特定の値を1つずつインクリメントする方法

例CSVファイル:だから

require 'csv' 

currentStore = store # store is passed as a parameter 
if currentStore.nil? && currentStore.empty? 
    currentStore = "nil" 

store_data = {} 

File.open('store_count.csv').each_line {|line| 
    line_data = line.split(",") 
    if !line_data[1].nil? && !line_data[1].empty? 
     store[line_data[0]] = line_data[1].strip.to_i 
    else 
     next 
    end 
} 

if store_data.key?(currentStore) 
    store_data[currentStore] += 1 

    CSV.open("store_count.csv", "wb") { 
     |csv| store_data.to_a.each { 
      |elem| csv << elem 
     } 
    } 
end 

私は 'store3' をインクリメントした場合、たとえば、私が見えるように私のファイルを必要とする:

store1,0 
store2,0 
store3,0 
...etc. 

Rubyコード

store1,0 
store2,0 
store3,1 
etc... 

私は値を増やした後、私はCSVに再保存する必要があります。

+1

を行うことができますあなたの最良のオプションは、CSVを読み、新しいCSVにそれを書くことで、プロセス中にあなたに一致する値を更新条件 –

+1

ファイルをメモリに読み込んで修正し、元のファイルに書き直すのは悪い考えです。ジョブが失敗すると、元のファイルが部分的に上書きされた場合に破損する可能性があります。 @WandMakerによると、新しいCSVファイルに書き込む。次に、元のファイルの名前を変更し終えたら、新しいファイルの名前を元の元の名前に変更し、古い名前で必要なものを実行します。また、行単位のI/Oを使用してください。スケーラビリティの問題がなく[ファイルをスラッシングする](http://stackoverflow.com/q/25189262/128421)の速さです。 –

+1

問題を解決しようとするより完全な例が必要です。つまり、あなたは裸足であることを実証しただけなので、私たちがチュートリアルを書いたり、あなたのためのコードを書いたり、トピックには載っていないように思えます。リンクされたページを含む「[mcve]」と「[ask]」をお読みください。 –

答えて

0

同時に読み書きすることはできません。

What are the Ruby File.open modes and options?

あなたがメモリにすべてを収めることができ、小さなファイル、扱っている場合、これは十分なはずです。

temp_file = File.open('temp.csv', 'w') 
CSV.readlines('temp.csv').each do |line| 
    temp_file << "#{line[0]},#{line[1].to_i + 1}\n" 
end 

temp_file.flush 
temp_file.close 

あなたはファイル名を変更したい場合は、この

`rm store.csv` 
`mv temp.csv store.csv` 
+3

サイズが決して拡大しないことが保証されていない限り、ファイルをメモリに読み込むのは良い習慣ではありません。人々が小さなファイルに対して開発し、それをメモリにロードしてから、プロダクションでコードを利用可能なメモリを超えてファイルに遭遇させるのは非常に一般的です。ライン単位のI/Oは高速で問題を回避します。また、オリジナルの名前を変更し、新しいファイルの名前を元のファイルの名前に変更してください。* THEN *元のファイルを削除しても問題ありません。 http://stackoverflow.com/a/18261457/128421は読みやすいです。 –

関連する問題