Как обновить заголовки CSV :: Table? - PullRequest
0 голосов
/ 15 января 2019

Есть ли хороший способ обновления заголовков в объекте CSV :: Table?

require 'csv'

txt =<<TXT
"h1","h2","h3"
1,"test",3
2,"test",6
3,"test",9
TXT

table = CSV::parse(txt, headers: true)
table.each do |row|
  row << {"h4" => "additional"}
end
puts table.to_csv

фактический

h1, h2,   h3  
1,  test, 3,  additional  
2,  test, 6,  additional  
3,  test, 9,  additional  

ожидается

h1, h2,   h3, h4  
1,  test, 3,  additional  
2,  test, 6,  additional  
3,  test, 9,  additional  

1 Ответ

0 голосов
/ 19 января 2019

Ваша проблема GitHub была решена автором. Вы можете установить гем из GitHub, и он будет работать так, как вы ожидаете.

Проблема в том, что вы не можете легко установить гем с помощью gem install. (если только вы не клонируете репозиторий, не соберете драгоценный камень и не установите драгоценный камень из вашей файловой системы, но это не переносимое решение). И если вы не можете использовать gem install, то вы не можете использовать require 'csv', потому что это будет просто использовать версия с ошибками, которую вы уже установили. (аналогично, клонирование репо и использование require '/path/to/csv-3.0.4' не является переносимым решением)

Обходной путь - использовать bundler для установки фиксированного гема в путь вашего пакета:

# Gemfile
gem 'csv', git: 'https://github.com/ruby/csv.git', ref: '7ede8e84a2b8'

Затем запустите bundle install:

Fetching https://github.com/ruby/csv.git
Resolving dependencies...
Using bundler 1.17.2
Using csv 3.0.4 from https://github.com/ruby/csv.git (at 7ede8e8@7ede8e8)
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

И запустить bundle info csv, чтобы подтвердить:

bundle info csv
  * csv (3.0.4 7ede8e8)
    Summary: CSV Reading and Writing
    Homepage: https://github.com/ruby/csv
    Path: /Users/foo/.rvm/gems/ruby-2.6.0/bundler/gems/csv-7ede8e84a2b8

Затем измените ваш скрипт, чтобы использовать bundler для загрузки драгоценных камней, и укажите версию камня, который вы хотите использовать:

# test.rb
require 'bundler/setup'
Bundler.require :default
gem 'csv', '=3.0.4'

puts CSV::VERSION

(вы не звоните require 'csv'; упаковщик делает это за вас)

Затем запустите ruby test.rb и убедитесь, что он использует ожидаемую версию гема:

3.0.4

Теперь измените test.rb, чтобы включить ваш оригинальный код:

require 'bundler/setup'
Bundler.require :default
gem 'csv', '=3.0.4'

txt =<<TXT
"h1","h2","h3"
1,"test",3
2,"test",6
3,"test",9
TXT

table = CSV::parse(txt, headers: true)

puts table.to_csv + "\n"

table.each do |row|
  row << {"h4" => "additional"}
end

puts table.to_csv

И запустить с ruby test.rb:

h1,h2,h3
1,test,3
2,test,6
3,test,9

h1,h2,h3,h4
1,test,3,additional
2,test,6,additional
3,test,9,additional

Теперь у вас есть переносимое решение, которое будет работать в любой системе и загружать гем из git-репозитория на коммите, где это исправление было реализовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...