处理列名称中的空格(Spotfire,R)

时间:2018-09-17 15:38:01

标签: r ms-access spotfire

我正在尝试通过RODBC R库API(称为sqlUpdate)将Spotfire数据表中的一行写入MS Access数据库:sqlUpdate(channel, inputTable,tablename = dTable,index = Index)

当一列中有空格,即名字或特殊字符。 R引擎删除这些空格并填充一个名为FirstName的新列。如何防止R或Spotfire表单这样做?

2 个答案:

答案 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"

要解决此问题,请考虑以下三个选项之一:

  1. 更新RODBC库包的源代码,以注释掉mangleColNames()中的sqlUpdate调用。具体来说,请使用以下here所示的方法。

    trace("sqlUpdate", edit=TRUE)
    

    但是,以上是您当前R会话的临时交互式修复。您将需要转到基础库软件包代码以对其进行永久调整。请注意:更改任何代码都可能会产生副作用。用这种方法要谨慎行事。

    实际上,您可能仍需要添加包装器来处理此类空格和特殊字符。在MS Access中,您可以使用方括号或反引号来处理此类名称。

  2. 使用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]")
    
  3. 使用其他数据库,例如R DBI投诉odbc,它没有sqlUpdate,但可以容纳dbWriteTable(),而无需假设列名。 / p>