2017-02-07 15 views
0

Я хотел бы использовать пакет RODBC , чтобы частично перезаписать таблицу Microsoft Access с фреймом данных. Вместо того, чтобы переписывать всю таблицу, я ищу способ удалить только определенные строки из этой таблицы, а затем добавить свой кадр данных до конца.Очистка определенных строк с использованием RODBC

Мой метод добавления рамки довольно прост. Я хотел бы использовать следующую функцию:

sqlSave(ch, df, tablename = "accessTable", rownames = F, append = T) 

Задача состоит в нахождении функции, которая позволит мне очистить конкретные номера строк из таблицы Access раньше времени. sqlDrop и sqlClear функции, похоже, не доставляют меня туда, поскольку они либо удалят, либо очищают всю таблицу в целом.

Любые рекомендации по достижению этой цели будут высоко оценены!

+0

Имеет ли ваш блок данных одинаковое точное количество столбцов в таблице доступа? – Parfait

+0

Да, кадр данных имеет ту же структуру, что и таблица Access. Большинство кадров в основном состоит из более новых данных временных рядов, но есть и некоторые перекрывающиеся записи. Следовательно, попытка удалить эти избыточные записи из исходной таблицы перед добавлением. В настоящее время я просматриваю функцию * sqlQuery * в пакете RODBC для потенциальных решений ... – lombax2019

+0

FYI, эти перекрывающиеся записи потенциально содержат обновленные результаты. Вот почему я хочу сохранить версии фрейма данных и удалить версии таблицы Access. – lombax2019

ответ

0

Действительно, рассмотрит с помощью sqlQuery подмножества таблицы Access строк, которые вы хотите сохранить, затем rbind с текущей dataframe и, наконец, sqlSave, намеренно перезаписать исходную таблицу Access с append = FALSE.

# IMPORT QUERY RESULTS INTO DATAFRAME 
keeprows <- sqlQuery(ch, "SELECT * FROM [accesstable] WHERE timedata >= somevalue") 

# CONCATENATE df to END 
finaldata <- rbind(keeprows, df) 

# OVERWRITE ORIGINAL ACCESS TABLE 
sqlSave(ch, finaldata, tablename = "accessTable", rownames = FALSE, append = FALSE) 

Конечно, вы можете также сделать счетчик, удалением строк из таблицы за указанную логику, а затем добавление (НЕ перезапись) с sqlSave:

# ACTION QUERY TO RUN IN DATABASE 
sqlQuery(ch, "DELETE FROM [accesstable] WHERE timedata <= somevalue") 

# APPEND TO ACCESS TABLE 
sqlSave(ch, df, tablename = "accessTable", rownames = FALSE, append = TRUE) 

ключом находит логику SQL, указывающую которые вы намерены сохранить.

+0

Спасибо, Парфе. Второй скрипт, похоже, является моим решением! Я рассмотрел первый вариант, но я хотел избежать импорта таблицы (так как она довольно большая). Я скоро проверю код ... – lombax2019

+0

Просто для наблюдения: этот подход работал отлично. Еще раз спасибо. – lombax2019