R Server 使用平面文件路径
R Server working with flat file paths
我正在尝试在 R(数据库内)服务器的存储过程中使用 fread
函数加载平面文件 .csv
。
显然,R 服务器(在后台)尝试将此文件复制到 C:\
中的工作目录,但失败了。
首先,存在R无法读取\
的问题,但是Windows个文件路径需要\
。我似乎已经克服了这个问题(我认为),但我不确定。
有人使用过将平面文件从文件路径加载到 R Server 引擎中吗?
代码如下:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[usp_R_FileMap] Script Date: 7/9/2018 11:25:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [dbo].[usp_R_FileMap]
(
@FilePath nvarchar(255),
@FileName nvarchar(255),
@FileExtension nvarchar(10)
)
AS
declare @RCode nvarchar(max)
set @FilePath = replace(@FilePath,'\','\')
set @RCode = N'
##PREPARE ENVIRONMENT##########################################################
usrInputFilePath <- "' + @FilePath + N'"
usrInputFileName <- "' + @FileName + N'"
usrInputFileType <- "' + @FileExtension + N'"
sysPackages <- c("data.table"
,"foreach"
,"reader"
,"stringr"
)
##install / load packages as necessary
for (ii in 1:length(sysPackages)) {
if (paste0("package:",sysPackages[ii]) %in% search()==F) {library(sysPackages[ii],character.only=T)}##if (!paste0("package:",sysPackages[ii]) %in% search())
}##for (ii in length(sysPackages))
##determine full file paths
vcInputFile <- paste0(usrInputFilePath,ifelse(substring(usrInputFilePath,nchar(usrInputFilePath),nchar(usrInputFilePath))!="\","\",""),usrInputFileName,usrInputFileType)
# vcInputFile <- file.path(usrInputFilePath,paste0(ifelse(substring(usrInputFilePath,nchar(usrInputFilePath),nchar(usrInputFilePath))!="\","\",""),usrInputFileName,usrInputFileType))
##DETERMINE DELIMITER##########################################################
vcInputFileDelimiter <- gsub("(Detecting sep ... '')","",grep("Detecting sep",capture.output(fread(vcInputFile,nrows=1,stringsAsFactors=F,verbose=T)),value=T))
print(vcInputFileDelimiter)
'
EXEC sp_execute_external_script
@language =N'R',
@script=@RCode;
GO
在 R 中,您使用 \
.
转义 ("backslash character") \
这适用于 R 中的字符串,并且按预期工作。
看不到错误确实让您更难提供帮助。无论如何,您要加载的文件位于何处?它必须在 SQL 服务器可以读取的位置。正如@Jiggles32 所说,\
应该可以,否则请尝试 /
.
我在此处写了一篇与加载脚本文件相关的博客 post:http://www.nielsberglund.com/2018/03/07/microsoft-sql-server-r-services-sp_execute_external_script-I/
让我们知道进展如何。
除了 \
与 \
问题之外,如果您尝试读取网络共享上的文件,您将被 Windows 防火墙规则阻止与 SQL Server R Services 一起安装。
如果您真的想从 R Services 的网络共享中提取文件,您可以禁用此规则 (Start -> Windows Firewall with Advanced Security -> Outbound Rules -> Block network access for R local user accounts in SQL Server instance MSSQLSERVER -> Right click -> Disable
)。
此外,R 在本地计算机帐户下处理 运行,例如 MSSQLSERVER01,这些用户需要权限才能访问网络共享上的文件。
我正在尝试在 R(数据库内)服务器的存储过程中使用 fread
函数加载平面文件 .csv
。
显然,R 服务器(在后台)尝试将此文件复制到 C:\
中的工作目录,但失败了。
首先,存在R无法读取\
的问题,但是Windows个文件路径需要\
。我似乎已经克服了这个问题(我认为),但我不确定。
有人使用过将平面文件从文件路径加载到 R Server 引擎中吗?
代码如下:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[usp_R_FileMap] Script Date: 7/9/2018 11:25:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [dbo].[usp_R_FileMap]
(
@FilePath nvarchar(255),
@FileName nvarchar(255),
@FileExtension nvarchar(10)
)
AS
declare @RCode nvarchar(max)
set @FilePath = replace(@FilePath,'\','\')
set @RCode = N'
##PREPARE ENVIRONMENT##########################################################
usrInputFilePath <- "' + @FilePath + N'"
usrInputFileName <- "' + @FileName + N'"
usrInputFileType <- "' + @FileExtension + N'"
sysPackages <- c("data.table"
,"foreach"
,"reader"
,"stringr"
)
##install / load packages as necessary
for (ii in 1:length(sysPackages)) {
if (paste0("package:",sysPackages[ii]) %in% search()==F) {library(sysPackages[ii],character.only=T)}##if (!paste0("package:",sysPackages[ii]) %in% search())
}##for (ii in length(sysPackages))
##determine full file paths
vcInputFile <- paste0(usrInputFilePath,ifelse(substring(usrInputFilePath,nchar(usrInputFilePath),nchar(usrInputFilePath))!="\","\",""),usrInputFileName,usrInputFileType)
# vcInputFile <- file.path(usrInputFilePath,paste0(ifelse(substring(usrInputFilePath,nchar(usrInputFilePath),nchar(usrInputFilePath))!="\","\",""),usrInputFileName,usrInputFileType))
##DETERMINE DELIMITER##########################################################
vcInputFileDelimiter <- gsub("(Detecting sep ... '')","",grep("Detecting sep",capture.output(fread(vcInputFile,nrows=1,stringsAsFactors=F,verbose=T)),value=T))
print(vcInputFileDelimiter)
'
EXEC sp_execute_external_script
@language =N'R',
@script=@RCode;
GO
在 R 中,您使用 \
.
\
这适用于 R 中的字符串,并且按预期工作。
看不到错误确实让您更难提供帮助。无论如何,您要加载的文件位于何处?它必须在 SQL 服务器可以读取的位置。正如@Jiggles32 所说,\
应该可以,否则请尝试 /
.
我在此处写了一篇与加载脚本文件相关的博客 post:http://www.nielsberglund.com/2018/03/07/microsoft-sql-server-r-services-sp_execute_external_script-I/
让我们知道进展如何。
除了 \
与 \
问题之外,如果您尝试读取网络共享上的文件,您将被 Windows 防火墙规则阻止与 SQL Server R Services 一起安装。
如果您真的想从 R Services 的网络共享中提取文件,您可以禁用此规则 (Start -> Windows Firewall with Advanced Security -> Outbound Rules -> Block network access for R local user accounts in SQL Server instance MSSQLSERVER -> Right click -> Disable
)。
此外,R 在本地计算机帐户下处理 运行,例如 MSSQLSERVER01,这些用户需要权限才能访问网络共享上的文件。