如何打开 CSV 文件并将特定值加一
Posted
技术标签:
【中文标题】如何打开 CSV 文件并将特定值加一【英文标题】:How to open a CSV file and increment a specific value by one 【发布时间】:2016-06-20 15:52:13 【问题描述】:我正在尝试在 Ruby 中打开一个简单的 CSV 文件,找到一个特定的键,将其值加一,然后重新保存。
CSV 文件示例:
store1,0
store2,0
store3,0
...etc.
Ruby 代码:
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,1
etc...
增加值后,我需要重新保存到 CSV。
【问题讨论】:
您最好的选择是读取 CSV 并将其写入新的 CSV,并在此过程中更新符合您条件的值 将文件加载到内存中,修改它然后将其重写为原始文件是一个坏主意。如果作业失败,如果原始文件被部分覆盖,则可能会损坏。正如@WandMaker 所说,写入一个新的 CSV 文件。然后,当您完成处理重命名原始文件时,将新文件重命名为旧的原始名称,然后对旧文件做任何您想做的事情。此外,使用逐行 I/O。它和slurping a file 一样快,没有可扩展性问题。 我们想要一个更完整的例子来说明您解决问题的尝试。照原样,您只演示了它的刚开始,所以看起来您希望我们编写教程或为您编写代码,这两者都不是主题。请阅读“minimal reproducible example”和“How to Ask”,包括链接页面。 对于缺少代码,我深表歉意,但如前所述,我是 Ruby 的初学者,语法有问题。我没有更完整的代码,因为我已经多次尝试解决这个问题,并反复修改我的代码。不幸的是它不起作用,所以我没有看到发布我已经删除的错误代码的意义。我会尽我所能重新创建我的错误代码。 我已经修改了我的原始查询,如上所述。希望这符合要求的标准。 【参考方案1】:你不能同时读和写。
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`
【讨论】:
将文件加载到内存中不是一个好习惯,除非可以保证它们永远不会变大。人们经常针对一个小文件进行开发,将其加载到内存中,然后在生产中遇到一个超出可用内存的文件,从而导致代码崩溃。逐行 I/O 的速度一样快,并且可以回避问题。另外,重命名原始文件,然后将新文件重命名为原始文件的名称,THEN 删除原始文件是安全的。 ***.com/a/18261457/128421 是一本好书。以上是关于如何打开 CSV 文件并将特定值加一的主要内容,如果未能解决你的问题,请参考以下文章
如何使用openoffice打开excel文件并保存为csv