使用R在SQL DB中插入记录

时间:2014-08-11 04:37:12

标签: r

我有一个文本文件。它包含简单的文本。

FileName - 234567.txt

我已经构建了此文件中存在的内容的语料库。我清理了语料库并创建了字符串向量,以将完整的文本存储在单个字符串向量中

FullTextstring <- "Complete text here"

我还将文件名保存在矢量

FileName <- "234567.txt"

我在数据库中有一个表&#34; TextData&#34;以下是表格字段: -

FileId int primary key , where FileID is the FileName
FileContent nvarchar(Max), where FileContent is text presnt in file

我想在文件夹中插入文件名及其内容。所以,我的查询是如何在&#34; FileName&#34;中插入值?和&#34; FullTextstring&#34;向量到我的表&#34; TextData&#34;。

我正在使用Windows 8.1。我已经安装了包&#34; RODBC&#34; 。我也看了很多例子,但找不到任何有用的东西。

1 个答案:

答案 0 :(得分:2)

如果您不熟悉R或数据库或两者兼而有之,我还发现一些RODBC文档无益。希望这可以帮助你入门。

如上面的评论所示,您需要做的第一件事是建立与数据库的ODBC连接。由于您没有指定,我假设您正在使用某些版本的MS-SQL Server。有关与MS-SQL服务器建立连接的说明here

在您的计算机上建立连接后(让我们称之为textSQL),您将要将该连接分配给R中的对象。在这里,我调用连接{{ 1}}。

con

如果你真的想从向量中插入每个值require(RODBC) con <- odbcConnect("textSQL") (似乎将所有内容组合到数据帧中,然后通过TextData更新数据库将是首选),那么你&#39 ; ll只需要运行SQL来做到这一点。但是,在您可以执行此操作之前,您需要将sqlSave()向量转换为可由整数数据库字段接收的内容。假设所有文件名都有三个字符后缀(加上一个句点),那么下面的内容应该可行。

FileName

现在您已将文件名存储为R中的数字,我们可以移动到在数据库服务器上填充表。为此,我们可以简单地将# as stated in your question FileName <- "234567.txt" FullTextstring <- "Complete text here" # convert FileName to int require(stringr) #filename length l <- nchar(FileName) #filename suffix s <- 4 FileName <- as.numeric(str_sub(FileName,1,l-s)) 函数与sqlQuery()函数结合使用,如下所示。请注意,该函数的第一个参数是上面指定的连接对象(paste())。

con

如果给定向量中有多个文件名和字符串,请相应地更新sqlQuery(con ,paste("insert into TextData values (" ,FileName[1] ,",\'" ,FullTextstring[1] ,"\')"))

另外,请注意RODBC内置字段长度有一个上限(我认为它是64k,如上所述here)。如果您正在处理大量文本,那么您可能会遇到此限制。如果发生这种情况,您可以修改源代码(它只是一行)并从源代码重新编译。

在评论中按请求更新

为了进行此更改,您需要先从CRAN here下载tar球。

接下来,您将需要导航到位于[1]目录中的C代码。

在第735行左右,您将看到一条注释和代码行,如下所示:

\RODBC\src

您可能希望将其更改为此类型(根据您的需要,新值可能更大或更小):

    /* sanity check as the reports are sometimes unreliable */
    if (datalen > 65535) datalen = 65535;

保存更改,然后使用here提供的说明重新安装修改后的RODBC软件包。

注意:当我尝试从RODBC连接将信息带入 R时,此解决方案对我有用。我充其量只是一名新手C程序员,并不完全理解Ripley的所有代码。此解决方案不会破坏RODBC,但它可能不允许您将 R中的极大字段传输到数据库中。您遇到的截断可能是某些SQL服务器设置的问题,而不是RODBC中的 /* sanity check as the reports are sometimes unreliable */ if (datalen > 10000000) datalen = 10000000; 上限。