F# 推断任意CSV文件的类型信息?

F# 推断任意CSV文件的类型信息?,f#,f#-data,f#-scripting,compiler-services,F#,F# Data,F# Scripting,Compiler Services,我想使用以下控制台程序获取Csv类型提供程序的类型信息(而不是数据)。文件名将作为命令行参数传递。但是,CsvProvider似乎只接受常量文本 有办法解决这个问题吗?或者可以使用F#脚本来完成吗? 或者F#编译器服务可以提供帮助吗 或者有没有其他项目能做到这一点 open FSharp.Data open Microsoft.FSharp.Collections open System [<Literal>] let fn = """C:\...\myfile.csv""" /

我想使用以下控制台程序获取Csv类型提供程序的类型信息(而不是数据)。文件名将作为命令行参数传递。但是,
CsvProvider
似乎只接受常量文本

有办法解决这个问题吗?或者可以使用F#脚本来完成吗? 或者F#编译器服务可以提供帮助吗

或者有没有其他项目能做到这一点

open FSharp.Data
open Microsoft.FSharp.Collections
open System

[<Literal>] 
let fn = """C:\...\myfile.csv""" // Want to dynamically set the fn from arguments

[<EntryPoint>]
let main argv = 
    let myFile = CsvProvider<fn>.GetSample()
    // The following doesn't work
    let fn = argv.[0]
    let myFile = CsvProvider<fn>.GetSample()

    // code to get type information of myFile
打开FSharp.Data
打开Microsoft.FSharp.Collections
开放系统
[] 
让fn=“”C:\…\myfile.csv”“”//要根据参数动态设置fn
[]
让主argv=
让myFile=CsvProvider.GetSample()
//下面的方法不起作用
设fn=argv[0]
让myFile=CsvProvider.GetSample()
//获取myFile类型信息的代码

我认为您可能误解了CSV类型提供程序的用途——其目的是在编译时提供一个具有代表性的数据样本(并可以使用它来指导类型推断)。在运行时,您只需给它(可能是不同的)相同格式的文件。这为您提供了一种处理已知格式文件的好方法

如果您想解析任意CSV文件(具有不同的标题等),则CSV类型提供程序将不会有帮助。但是,您仍然可以使用F#Data中的
CsvFile
类型,它提供了一个简单的CSV解析器。例如:


在这里,您可以轻松地使用漂亮的静态类型,但您可以加载任何格式的文件(然后动态查看文件中可用的列)。

我认为您可能误解了CSV类型提供程序的用途-其想法是您在编译时有一个具有代表性的数据样本可用(并且可以使用它来指导类型推断)。在运行时,您只需给它(可能是不同的)具有相同格式的文件。这为您提供了一种处理具有已知格式的文件的好方法

如果您想解析任意CSV文件(具有不同的标题等),则CSV类型提供程序将不会有帮助。但是,您仍然可以使用F#Data中的
CsvFile
类型,它提供了一个简单的CSV解析器。示例:


在这里,您可以轻松地进行静态键入,但您可以加载任何格式的文件(然后动态查看文件中可用的列)。

根据Tomas的建议,可以使用以下F#Data CSV provider函数来解决此问题

let data = CsvFile.Load(....)
let inferredProperties =
    // InferColumnTypes : inferRows:int 
    // * missingValues:string [] 
    // * cultureInfo:CultureInfo 
    // * schema:string 
    // * assumeMissingValues:bool 
    // * preferOptionals:bool 
    // * ?unitsOfMeasureProvider:IUnitsOfMeasureProvider 
    // -> PrimitiveInferedProperty list
    data.InferColumnTypes(10000, [|""|], CultureInfo.InvariantCulture, "", false, true)

不确定应该使用什么参数。但是上面的设置似乎工作正常。

根据Tomas的建议,可以使用以下F#-Data CSV provider函数来解决此问题

let data = CsvFile.Load(....)
let inferredProperties =
    // InferColumnTypes : inferRows:int 
    // * missingValues:string [] 
    // * cultureInfo:CultureInfo 
    // * schema:string 
    // * assumeMissingValues:bool 
    // * preferOptionals:bool 
    // * ?unitsOfMeasureProvider:IUnitsOfMeasureProvider 
    // -> PrimitiveInferedProperty list
    data.InferColumnTypes(10000, [|""|], CultureInfo.InvariantCulture, "", false, true)

不确定应该使用什么参数。但是上面的设置似乎工作正常。

谢谢。在我的一个项目中,我想利用CSV类型提供程序的自动类型发现/推断功能来获取任何任意CSV文件的列类型。CsvFile不会推断/推断CSV列的类型,因此它不会有帮助。这就是为什么我想使用动态创建F#script或F#compiler服务和CSV类型提供程序来实现它。或者是否有其他F#项目可以自动获取平面文件的列类型?实际上,我认为F#数据类型提供程序也可以导出这样一个非常有用的函数,因为它已经内置了一些东西它目前未在公共API中公开,但您当然可以访问它-尽管您可能需要从F#Data复制相关文件。例如,Deedle正是这样做的:我认为F#Data会乐意接受一个PR,它将使功能公开,只要它添加相关的单元测试和文档(这些额外的东西是很难公开的主要原因!)(事实上,我认为它可能已经公开了,但可能只是没有记录!)谢谢。在我的一个项目中,我想利用CSV类型提供程序的自动类型发现/推断功能来获取任意CSV文件的列类型。CsvFile不会推断/推断CSV列的类型,因此它不会有帮助。这就是为什么我考虑使用CSV类型p的动态创建F#脚本或F#编译器服务的原因或者有没有其他F#项目可以自动获取平面文件的列类型?事实上,我认为F#数据类型提供程序也可以导出这样一个非常有用的函数,因为它已经内置了一些东西。AFAIK,类型推断目前没有在公共API中公开,但您肯定可以访问它-尽管您可能需要从F#Data复制相关文件。例如,Deedle正是这样做的:我认为F#Data会很乐意接受一个将功能公开的PR,只要它添加了相关的单元测试和文档(这些额外的东西是很难公开的主要原因!)(事实上,我认为它可能已经公开了,但可能只是没有记录在案!)