Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用变量作为F#类型提供程序引用的文件的路径_F#_Sas_Type Providers - Fatal编程技术网

使用变量作为F#类型提供程序引用的文件的路径

使用变量作为F#类型提供程序引用的文件的路径,f#,sas,type-providers,F#,Sas,Type Providers,如何将变量路径传递给类型提供程序 我有一个文件要使用SAS类型提供程序加载,该文件位于不同PC上的不同位置 例如,我想做如下事情: [<Literal>] let saspath = match System.Environment.MachineName with | "a" -> "c:/sas.sas7bdat" | "b" -> "d:/sas.sas7bdat" let sasfile = new SasFileTypeProvider

如何将变量路径传递给类型提供程序

我有一个文件要使用SAS类型提供程序加载,该文件位于不同PC上的不同位置

例如,我想做如下事情:

[<Literal>]
let saspath =
    match System.Environment.MachineName with
    | "a" -> "c:/sas.sas7bdat"
    | "b" -> "d:/sas.sas7bdat"

let sasfile = new SasFileTypeProvider<saspath>()
[]
让萨斯帕=
将System.Environment.MachineName与匹配
|“a”->“c:/sas.sas7bdat”
|“b”->“d:/sas.sas7bdat”
让sasfile=new SasFileTypeProvider()

但这是无效的。它与此相关,但我没有使用相对路径的选项

不幸的是,这不容易做到。传递给类型提供程序的参数必须是(语法上)常量。有各种变通办法

使用相对路径。您能将代码更改为使用始终有效的相对路径吗?这将是理想的-假设类型提供程序支持这一点

改进类型提供程序。您可以向SAS类型提供程序发送PR,以便它可以从本地配置文件或环境变量获取文件名。许多SQL类型提供程序都这样做,因为如果您需要一些配置,这是一个很好的解决方案

使用常量生成文件。这有点麻烦,但是您可以使用常量生成一个单独的
fsx
文件并加载它。在剩下的代码中,您会看到红色的曲线(直到您运行脚本的第一部分),但如果您对此满意:

open System.IO
let text = 
  match System.Environment.MachineName with
  | "a" -> "module Constants\n[<Literal>] let path = \"c:/sas.sas7bdat\""
  | "b" -> "module Constants\n[<Literal>] let path = \"c:/sas.sas7bdat\""
File.WriteAllText("C:/temp/constants.fsx", text)
;;

#load "C:/temp/constants.fsx"
let sasfile = new SasFileTypeProvider<Constants.path>()
opensystem.IO
让文本=
将System.Environment.MachineName与匹配
|“a->”模块常量\n[]let path=\“c:/sas.sas7bdat”
|“b”->“模块常量\n[]let path=\“c:/sas.sas7bdat”
File.writealText(“C:/temp/constants.fsx”,text)
;;
#加载“C:/temp/constants.fsx”
让sasfile=new SasFileTypeProvider()

类型提供程序在编译时运行。当时您还不知道程序将运行的计算机的名称。计算机是已知的,因为我是通过.fsx文件运行的。听起来您需要Mixin类型提供程序!