ConfigParser в R дублирует ключи при записи

#r #config

#r #конфигурация

Вопрос:

Я пытаюсь использовать библиотеку ConfigParser в R для записи в существующий файл конфигурации. Библиотека указана в CRAN вместе с очень короткой документацией. Я создал фиктивный конфигурационный файл с именем test.ini со следующим содержимым:

 [group]
why=1
are=2
you=3
broken=4
 

и затем я использую следующий R-скрипт для записи в файл конфигурации:

 library(ConfigParser)

config <- ConfigParser$new() # Create a config parser
config$read("test.ini")

# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_value", "group")) 
bar <- c(config$set("bar_key", "bar_value", "group"))

config$write("test.ini")
 

Когда я запускаю скрипт R, результат соответствует ожидаемому:

 [group]
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
 

Однако, когда я запускаю его во второй раз, я в конечном итоге создаю дубликаты ключей:

 [group]
bar_key=bar_value
foo_key=foo_value
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
 

Это, очевидно, нежелательно. Документация короткая, и я не заметил никаких опций, которые я мог бы пропустить. Я также не видел никаких нерешенных проблем в репозитории GitHub для библиотеки. Я не могу представить, что это упущение со стороны человека, который создал библиотеку, поэтому я, должно быть, что-то упускаю. Буду признателен за любую помощь.

Редактировать:

Я должен был более четко указать вторую запись. Вторая запись может быть законной в результате изменения значения, связанного с ключом. Итак, мой второй запуск должен был выглядеть так:

 library(ConfigParser)

config <- ConfigParser$new() # Create a config parser
config$read("test.ini")

# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_changed", "group")) 
bar <- c(config$set("bar_key", "bar_changed", "group"))

config$write("test.ini")
 

И тогда результаты будут:

 [group]
bar_key=bar_changed
foo_key=foo_changed
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
 

В каждом анализаторе файлов конфигурации, о котором я знаю (GLib, python ConfigParser), библиотека будет знать достаточно, чтобы заменить существующее значение, связанное с ключом, на новое значение, А не просто дублировать ключ в файле конфигурации. В этом проблема.

Комментарии:

1. Если вы запустите его n раз, вы добавляете больше целых элементов снова и снова. Может быть, вам нужно if/else проверить или прокомментировать config.write строку

Ответ №1:

Может быть, лучше иметь if/else проверку

 if(is.null(config$data[["group"]][["foo_key"]])) {
   # create new keys to add to the config file
   foo <- c(config$set("foo_key", "foo_value", "group")) 


    config$write("test.ini")
 }
 

config$data Возвращает a list с key/value парами. Если ключ отсутствует, значение будет NULL . Итак, по сути, мы просим записать только if тот ключ, которого нет

-тестирование

 # // initial case
config <- ConfigParser$new()
config$read("test.ini")
config$data
#$group
#$group$why
#[1] "1"

#$group$are
#[1] "2"

#$group$you
#[1] "3"

#$group$broken
#[1] "4"



config$data[["group"]][["foo_key"]]
#NULL
# // Now we add the new key
if(is.null(config$data[["group"]][["foo_key"]])) {
    # create new keys to add to the config file
    foo <- c(config$set("foo_key", "foo_value", "group")) 
     config$write("test.ini")
  }

# // Run the step again
if(is.null(config$data[["group"]][["foo_key"]])) {
    # create new keys to add to the config file
    foo <- c(config$set("foo_key", "foo_value", "group")) 
     config$write("test.ini")
  }

# // read it again
config$read("test.ini")
config$data
#$group
#$group$foo_key # added only the first time
#[1] "foo_value"

#$group$why
#[1] "1"

#$group$are
#[1] "2"

#$group$you
#[1] "3"

$group$broken
[1] "4"
 

Комментарии:

1. Обычным поведением при записи в файлы конфигурации является замена значения, связанного с ключом, если ключ уже существует. Я не думаю, что это поможет?

2. @LeighK в любом случае, это работает для меня. Я также показал результат