F#数据类型提供程序-使用字符串变量创建

F#数据类型提供程序-使用字符串变量创建,f#,type-providers,f#-data,F#,Type Providers,F# Data,在F#中,我有以下代码 [<Literal>] let fname=fstFile.FullName.ToString() type genomeFile = CsvProvider<fname> 如果没有实际的硬编码字符串,我似乎无法创建类型。有人知道如何解决这个问题吗?问题是[]只能应用于编译时已知的东西(例如“Hello”) fstFile.FullName.ToString()的结果只有在运行时才知道 这种方法不起作用。CSV类型提供程序的参数必须是常量,以便在

在F#中,我有以下代码

[<Literal>]
let fname=fstFile.FullName.ToString()
type genomeFile = CsvProvider<fname>

如果没有实际的硬编码字符串,我似乎无法创建类型。有人知道如何解决这个问题吗?

问题是
[]
只能应用于编译时已知的东西(例如
“Hello”

fstFile.FullName.ToString()的结果只有在运行时才知道


这种方法不起作用。

CSV类型提供程序的参数必须是常量,以便在编译时生成类型(无需实际评估程序)。但是,您可以在运行时加载具有相同架构的不同文件

因此,处理此问题的最佳方法是将一个实际输入复制到某个已知位置(例如,与脚本位于同一目录中的
sample.csv
),然后在运行时使用实际路径:

// Generate type based on a statically known sample file
type GenomeFile = CsvProvider<"sample.csv">

// Load the data from the actual input at runtime
let actualData = GenomeFile.Load(fstFile.FullName.ToString())
//基于静态已知的示例文件生成类型
类型GenomeFile=CsvProvider
//在运行时从实际输入加载数据
让actualData=GenomeFile.Load(fstFile.FullName.ToString())

但是,如果在已编译的DLL中引用一个文本,它就会工作。因此, 例如,如果您将示例拆分为两个项目

e、 g.使用TypeProviderArgs.fs==>TypeProviderArgs.dll创建一个新项目

module TypeProviderArgs
[<Literal>]
let fname=fstFile.FullName.ToString()
模块类型ProviderArgs
[]
设fname=fstFile.FullName.ToString()
然后在程序中引用TypeProviderArgs.dll,它应该可以工作

type genomeFile = CsvProvider<TypeProviderArgs.fname>
type genomeFile=CsvProvider
如果为了这个目的你必须创建一个库,这有点可怕,
但是,如果您在一个已经有库的大型项目中,情况还不错。

谢谢,看起来类型提供程序运行得不太好。无论如何,即使提供很少的行作为推断参数,它似乎也会耗尽内存。不过,非常感谢您的帮助。您知道是否有可能避免内存不足错误吗?理论上,我是只想逐个解析每一行,但即使使用硬编码字符串,也会出现内存不足错误(InferRows=50不起作用)。请查看文档中的“处理大数据集”:
type genomeFile = CsvProvider<TypeProviderArgs.fname>