F#CsvTypeProvider从略有不同的csv文件中提取相同的列

F#CsvTypeProvider从略有不同的csv文件中提取相同的列,csv,f#,type-providers,f#-data,Csv,F#,Type Providers,F# Data,我正在创建一个程序,从不同的CSV文件读取足球比赛。我感兴趣的列出现在所有文件中,但这些文件的列数不同 这让我为文件的每个变体创建了一个单独的映射函数,并为每种类型创建了一个不同的示例: type GamesFile14 = CsvProvider<"./data/sample_14.csv"> type GamesFile15 = CsvProvider<"./data/sample_15.csv"> type GamesFile1617 = CsvProvider&l

我正在创建一个程序,从不同的CSV文件读取足球比赛。我感兴趣的列出现在所有文件中,但这些文件的列数不同

这让我为文件的每个变体创建了一个单独的映射函数,并为每种类型创建了一个不同的示例:

type GamesFile14 = CsvProvider<"./data/sample_14.csv">
type GamesFile15 = CsvProvider<"./data/sample_15.csv">
type GamesFile1617 = CsvProvider<"./data/sample_1617.csv">

let mapRows14 (rows:seq<GamesFile14.Row>) = rows |> Seq.map ( fun c -> { Division = c.Div; Date = DateTime.Parse c.Date; 
        HomeTeam = { Name = c.HomeTeam; Score = c.FTHG; Shots = c.HS; ShotsOnTarget = c.HST; Corners = c.HC; Fouls = c.HF }; 
        AwayTeam = { Name = c.AwayTeam; Score = c.FTAG; Shots = c.AS; ShotsOnTarget = c.AST; Corners = c.AC; Fouls = c.AF };
        Odds = { H = float c.B365H; U = float c.B365D;  B = float c.B365A } } ) 


let mapRows15 (rows:seq<GamesFile15.Row>) = rows |> Seq.map ( fun c -> { Division = c.Div; Date = DateTime.Parse c.Date; 
        HomeTeam = { Name = c.HomeTeam; Score = c.FTHG; Shots = c.HS; ShotsOnTarget = c.HST; Corners = c.HC; Fouls = c.HF }; 
        AwayTeam = { Name = c.AwayTeam; Score = c.FTAG; Shots = c.AS; ShotsOnTarget = c.AST; Corners = c.AC; Fouls = c.AF };
        Odds = { H = float c.B365H; U = float c.B365D;  B = float c.B365A } } ) 


let mapRows1617 (rows:seq<GamesFile1617.Row>) = rows |> Seq.map ( fun c -> { Division = c.Div; Date = DateTime.Parse c.Date; 
        HomeTeam = { Name = c.HomeTeam; Score = c.FTHG; Shots = c.HS; ShotsOnTarget = c.HST; Corners = c.HC; Fouls = c.HF }; 
        AwayTeam = { Name = c.AwayTeam; Score = c.FTAG; Shots = c.AS; ShotsOnTarget = c.AST; Corners = c.AC; Fouls = c.AF };
        Odds = { H = float c.B365H; U = float c.B365D;  B = float c.B365A } } ) 
在我看来,一定有更好的办法来解决这个问题

有没有办法使映射函数更通用,这样就不必一遍又一遍地重复相同的函数

是否可以根据资源动态创建CsvProvider,或者是否需要像上面的代码那样为csv文件的每个变体显式声明一个示例


其他建议?

在您的场景中,您可能会从中获得更好的结果。它使用了一种更动态的CSV解析方法,使用动态的
操作符进行数据访问:您将失去类型提供程序提供给您的一些类型安全保证,由于每个单独的CSV文件都将加载到save
CsvRow
类型中,这意味着您不能保证在编译时任何给定的列都会在一个文件中,您必须为运行时错误做好准备。但在您的情况下,这正是您想要的,因为这将允许您的三个函数像这样重写:

let mapRows14 rows = rows |> Seq.map ( fun c -> { Division = c?Div; Date = DateTime.Parse c?Date; 
        HomeTeam = { Name = c?HomeTeam; Score = c?FTHG; Shots = c?HS; ShotsOnTarget = c?HST; Corners = c?HC; Fouls = c?HF }; 
        AwayTeam = { Name = c?AwayTeam; Score = c?FTAG; Shots = c?AS; ShotsOnTarget = c?AST; Corners = c?AC; Fouls = c?AF };
        Odds = { H = float c?B365H; U = float c?B365D;  B = float c?B365A } } )
尝试一下
CsvFile
,看看它是否能解决您的问题

let mapRows14 rows = rows |> Seq.map ( fun c -> { Division = c?Div; Date = DateTime.Parse c?Date; 
        HomeTeam = { Name = c?HomeTeam; Score = c?FTHG; Shots = c?HS; ShotsOnTarget = c?HST; Corners = c?HC; Fouls = c?HF }; 
        AwayTeam = { Name = c?AwayTeam; Score = c?FTAG; Shots = c?AS; ShotsOnTarget = c?AST; Corners = c?AC; Fouls = c?AF };
        Odds = { H = float c?B365H; U = float c?B365D;  B = float c?B365A } } )