4

我正在使用ExcelDNA为 Excel 编写 F# 插件 UDF ,理想情况下,我希望根据另一个 CSV 的内容动态加载 CSV。

我一直在下面的 F# 数据库中使用类型提供程序和 csv 解析器:http: //fsharp.github.io/FSharp.Data/library/CsvProvider.html

类型提供程序不会让我在编译时间之前将变量作为字符串传递,因为它不是静态的(也许我做错了 - 请参阅下面的代码,它不起作用)。

let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">()
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |]


let onstructure = new CsvProvider<closescc.[0], ",">()

提供的类型的静态参数无效。需要一个“字符串”类型的参数。

但是,如果我使用来自同一个库的 CSV 解析器,它可以工作(但是我失去了提供程序的强类型方面)。

let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">()
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |]

let onstructure = CsvFile.Load(closescc.[0]).Cache()

我想知道的是:
由于这将在 Excel 中多次调用,如果使用 CsvParse 方法与 CSV 类型提供程序相比会有显着的性能损失,特别是如果我需要在csvparse 方法。

注意我需要为每个计算加载大约 4 个 csv,这些 csv 大约有 600-2000 行长。在这个阶段我没有去数据库的选项。

谢谢你。

4

1 回答 1

3

您传递给 CsvProvider 的静态字符串参数是它推断架构的模板,但您可以在运行时使用不同的值。所以代替这个:

let sample = new CsvProvider<"Sample.csv">()

做这个:

let csv = CsvProvider<"Sample.csv">.Load("runtimeLocation.csv")

或这个:

type CsvType = CsvProvider<"Sample.csv">
let csv = CsvType.Load("runtimeLocation.csv")

至于性能,CsvProvider 内部使用相同的 csv 解析器,所以 CsvFile 应该有类似的性能特征,区别只是强类型

于 2014-01-23T11:23:34.343 回答