【发布时间】:2018-10-13 23:39:21
【问题描述】:
我有一个 CSV 文件,我只想更改某些列的标题(我的实际文件中大约有 20 个)。这是一个示例 CSV 文件:
CSV 文件
"name","blah_01_blah","foo_1_01_foo","bacon_01_bacon","bacon_02_bacon"
"John","yucky","summer","yum","food"
"Mary","","","cool","sundae"
我一直在尝试使用 File/IO 类,但是当它读取文件以执行 gsub 时,它会删除每个字符串周围用逗号分隔的所有引号。这是我正在使用的代码:
Ruby 代码
file = 'file.csv'
replacements = {
'blah_01_blah' => 'newblah1',
'foo_01_foo' => 'coolfoo1',
'bacon_01_bacon' => 'goodpig1',
'bacon_01_bacon' => 'goodpig2'
}
matcher = /#{replacements.keys.join('|')}/
outdata = File.read(file).gsub(matcher, replacements)
File.open(file, 'w') do |out|
out << outdata
end
我最终得到的是 CSV 文件中的这个:
新建 CSV 文件
name,blah_01_blah,foo_1_01_foo,bacon_01_bacon,bacon_02_bacon
John,yucky,summer,yum,food
Mary,"","",cool,sundae
它将引号保留在空白字段中,但将它们从其他地方的字符串中取出。我想保留这些引号,以防由于某种原因流氓逗号最终出现在某个字符串中,这样它就不会被丢弃。如何更改标题而不丢失字符串周围的引号?
编辑 - 这是我希望文件最后的样子。
预期结果 CSV 文件
"name","newblah1","coolfoo1","goodpig1","goodpig2"
"John","yucky","summer","yum","food"
"Mary","","","cool","sundae"
谢谢!
【问题讨论】:
-
当您只想编辑 标题(第一行)时,为什么还要阅读 整个文件 (
File.read(file))?这是非常低效的,并且可能容易出错。 -
你想要简历最后是什么样子?