Обрабатывать пробелы в именах столбцов (spotfire, R) - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь записать строку из таблицы данных Spotfire в базу данных MS Access через API библиотеки RODBC R (она называется sqlUpdate): sqlUpdate(channel, inputTable,tablename = dTable,index = Index)

Когда есть столбец с пробелами, т.е. имя или специальные символы. Движок R удаляет эти пробелы и заполняет новый столбец с именем FirstName. Как предотвратить это с помощью формы R или Spotfire?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Как показывает исходный код , RODBC::sqlUpdate() очищает имена столбцов специальных символов (не буквенно-цифровых символов) с помощью функции mangleColNames():

mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)

, который удаляет все пробелы, как показано здесь:

colnames <- "First Name"

mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)
mangleColNames(colnames)
# [1] "FirstName"

Чтобы решить, рассмотрите один из трех вариантов:

  1. Обновите исходный код вашего пакета библиотеки RODBC, чтобы закомментировать mangleColNames() вызов в sqlUpdate. В частности, используйте подход ниже, как показано здесь .

    trace("sqlUpdate", edit=TRUE)
    

    Однако выше приведено временное интерактивное исправление для текущего сеанса R. Вам нужно будет перейти к базовому коду пакета библиотеки, чтобы постоянно его корректировать. Обратите внимание: при изменении любого кода возможны побочные эффекты. Действуйте осторожно с таким подходом.

    На самом деле, вам все еще может понадобиться добавить обертку для обработки таких пробелов и специальных символов. В MS Access вы должны использовать квадратные скобки или обратные кавычки для работы с такими именами.

  2. Обновлять имена столбцов в MS Access с помощью команд DDL, переданных в sqlQuery. Кстати, как и во всех СУБД, настоятельно рекомендуется не использовать пробелы, специальные символы или зарезервированные ключевые слова в именах столбцов, таблиц, представлений или других хранимых объектов.

    ALTER TABLE mytable ALTER COLUMN fieldname fieldtype
    

    Что бы вы сделали следующим образом и можно зациклить, чтобы обновить все столбцы:

    # ADD NEW COLUMN
    sqlQuery(channel, "ALTER TABLE mytable ADD COLUMN [FirstName] Text(255)")
    sqlQuery(channel, "UPDATE mytable SET [FirstName] = [First Name]")
    
    # DROP OLD COLUMN
    sqlQuery(channel, "ALTER TABLE mytable DROP COLUMN [First Name]")
    
  3. Используйте другую библиотеку, такую ​​как жалоба R DBI, odbc, которая не имеет sqlUpdate, но может содержать dbWriteTable() без предположения имен столбцов.

0 голосов
/ 17 сентября 2018

Попробуйте добавить следующую строку кода, чтобы удалить имена столбцов.

names (имя таблицы) <- gsub ("", "", colnames (tablename)) # удалить пробелы из имен столбцов </p>

...