0

使用动态值作为类型提供程序的参数的正确方法是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

我究竟做错了什么?

4

2 回答 2

2

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

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

于 2018-08-02T19:03:57.567 回答
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
于 2018-08-02T19:06:37.130 回答