如何使用命令行参数作为类型提供程序的参数



对于CsvProvider这样的类型提供程序,使用动态值作为参数的正确方法是什么?我希望这能奏效:

open System.IO
open FSharp.Data
[<EntryPoint>]
let main argv =
type Stock = CsvProvider<argv.[0]>
let stockData = Stock.Load(argv.[0])
for row in stockData.Rows do
printfn "(%A, %A, %A, %A)" row.High row.Low row.Open row.Close
0 //Exit

我做错了什么?

不能将命令行参数用作类型提供程序的静态参数。行type Stock = CsvProvider<argv.[0]>要求CsvProvider的参数为编译时常数,因为类型提供程序生成的类型是在编译时创建的,而不是在运行时创建的。

您可以为Load函数提供一个不同的值,这可以是一个运行时值,如在Stock.Load(argv.[0])行中所示,但您需要使用一个编译时常量文件名或与作为命令行参数传递的文件的预期布局匹配的示例数据,以便在编译时生成的类型将与运行时传入的文件的结构匹配(即使数据可能不同(。

对于任何类型提供程序,您都需要一个模式,以便编译器能够了解数据的形状。因此,它必须是在编译时可用的东西。一种方法是将其放在一个文件中:

High,Low,Open,Close
29.53,29.17,29.45,29.23
29.70,29.40,29.61,29.50
29.65,29.07,29.07,29.56
29.57,29.18,29.47,29.34

然后,您可以在main函数的外部导入,如下所示:

// or whatever you called the file
type Stock = CsvProvider<"schema.csv">

如果您愿意,CsvProvider还可以为它提供一个内联模式:

type Stock = CsvProvider<"High,Low,Open,Close
29.53,29.17,29.45,29.23">

这是在整个程序的上下文中:

open System.IO
open FSharp.Data
type Stock = CsvProvider<"schema.csv">

[<EntryPoint>]
let main argv =
let stockData = Stock.Load(argv.[0])
for row in stockData.Rows do
printfn "(%A, %A, %A, %A)" row.High row.Low row.Open row.Close
0

最新更新