F# 推断任意CSV文件的类型信息?
我想使用以下控制台程序获取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""" /
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,只要它添加了相关的单元测试和文档(这些额外的东西是很难公开的主要原因!)(事实上,我认为它可能已经公开了,但可能只是没有记录在案!)