推断任意 CSV 文件的类型信息?
Infer the type information for any arbitrary CSV files?
我想使用以下控制台程序获取 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
我认为您可能误解了 CSV 类型提供程序的目的 - 这个想法是您在编译时有一个可用的代表性数据样本(并且可以用它来指导类型推断)。在运行时,您只需给它(可能是不同的)具有相同格式的文件。这为您提供了一种处理已知格式文件的好方法。
如果您想解析任意 CSV 文件(具有不同的 headers 等),那么 CSV 类型提供程序将无济于事。但是,您仍然可以使用 F# Data 中的 CsvFile
类型,它提供了一个简单的 CSV 解析器。例子 from the documentation:
// Download the stock prices
let msft = CsvFile.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")
// Print the prices in the HLOC format
for row in msft.Rows do
printfn "HLOC: (%s, %s, %s)" (row.GetColumn "High")
(row.GetColumn "Low") (row.GetColumn "Date")
在这里,您失去了漂亮的静态类型,但您可以加载任何格式的文件(然后动态查看文件中可用的列)。
根据 Tomas 的建议,可以使用以下 F#-Data CSV 提供程序函数来解决该问题。
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 类型提供程序的类型信息(不是数据)。文件名将作为命令行参数传递。但是,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
我认为您可能误解了 CSV 类型提供程序的目的 - 这个想法是您在编译时有一个可用的代表性数据样本(并且可以用它来指导类型推断)。在运行时,您只需给它(可能是不同的)具有相同格式的文件。这为您提供了一种处理已知格式文件的好方法。
如果您想解析任意 CSV 文件(具有不同的 headers 等),那么 CSV 类型提供程序将无济于事。但是,您仍然可以使用 F# Data 中的 CsvFile
类型,它提供了一个简单的 CSV 解析器。例子 from the documentation:
// Download the stock prices
let msft = CsvFile.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")
// Print the prices in the HLOC format
for row in msft.Rows do
printfn "HLOC: (%s, %s, %s)" (row.GetColumn "High")
(row.GetColumn "Low") (row.GetColumn "Date")
在这里,您失去了漂亮的静态类型,但您可以加载任何格式的文件(然后动态查看文件中可用的列)。
根据 Tomas 的建议,可以使用以下 F#-Data CSV 提供程序函数来解决该问题。
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)
不确定应该使用什么参数。但是上面的设置似乎没问题。