我正在尝试通过RODBC R库API(称为sqlUpdate)将Spotfire数据表中的一行写入MS Access数据库:sqlUpdate(channel, inputTable,tablename = dTable,index = Index)
当一列中有空格,即名字或特殊字符。 R引擎删除这些空格并填充一个名为FirstName的新列。如何防止R或Spotfire表单这样做?
答案 0 :(得分:0)
尝试添加以下代码行以删除列名。
名称(表名)<-gsub(“”,“”,colnames(表名))#从列名中删除空格
答案 1 :(得分:0)
如source code所示,RODBC::sqlUpdate()
使用mangleColNames()
函数清除特殊字符(非字母数字字符)的列名:
mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)
其中删除了所有空格,如下所示:
colnames <- "First Name"
mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)
mangleColNames(colnames)
# [1] "FirstName"
要解决此问题,请考虑以下三个选项之一:
更新RODBC库包的源代码,以注释掉mangleColNames()
中的sqlUpdate
调用。具体来说,请使用以下here所示的方法。
trace("sqlUpdate", edit=TRUE)
但是,以上是您当前R会话的临时交互式修复。您将需要转到基础库软件包代码以对其进行永久调整。请注意:更改任何代码都可能会产生副作用。用这种方法要谨慎行事。
实际上,您可能仍需要添加包装器来处理此类空格和特殊字符。在MS Access中,您可以使用方括号或反引号来处理此类名称。
使用sqlQuery
中传递的DDL命令更新MS Access中的列名。顺便说一句,像所有DBMS一样,强烈建议不要在列,表,视图或其他存储的对象的名称中使用空格,特殊字符或reserved keywords。
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]")
使用其他数据库,例如R DBI投诉odbc
,它没有sqlUpdate
,但可以容纳dbWriteTable()
,而无需假设列名。 / p>