如何打开 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

如何防止excel在打开CSV文件时对其进行任何更改

如何使用bash脚本从csv文件中读取特定的整数?

我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件

如何附加来自多个 csv 文件的值?

如何打开文件、替换一些字符串并将更新保存到同一个文件?