F# CSV解析到C#应用程序

3

我有一个C#控制台应用程序,调用了一个使用CSVTypeProvider进行CSV解析的F#库。(http://fsharp.github.io/FSharp.Data/reference/fsharp-data-csvprovider.html

不幸的是,我对F#还比较陌生,因此我没有找到一种有效地将解析后的数据以C#对象列表的形式传递给C#的方法。

假设我有一个C#数据模型:

public class Customer{
    public int ID { get; set; }
    public string Name { get; set; }
}

然后我希望将来自csv类型提供程序的数据转换为该模型的列表:

Extractor extractor = new Extractor();
List<Customer> customers = extractor.Data;

将Extractor定义为:

module internal FileLoader =
    type = Customers = CsvProvider<"C:\somefilePath", HasHeaders = true>

    let customers = Customers.Load<"C:\someFilePath">

type Extractor() =
    member this.Data = FileLoader.customers.Rows |> Seq.map(fun row -> new Customer(row.ID, row.Name))

我原本想可以将Datamodel导入F#库中,然后使用map函数将行的值映射到C#对象,但是似乎不太起作用。

编辑:

我找到了一种解决方法,但我仍然希望有更优雅的解决方案。

我只需要在F#库中创建所需的类(Customer)即可。

type Customer(ID : int, Name : string) =
    member this.ID = ID
    member this.Name = Name

然后我可以使用映射函数将行转换为客户对象,并将客户类型导入到C#中。

为什么它不起作用?预期结果没有发生,发生了什么? - phoog
当我访问提取器的数据属性时,我得到的是完整的行而不是对象列表。我需要进行转换。 - narain
1个回答

3
我会在 F# 项目中像这样定义我的模型类:
type Customer = {id:int;name:string}

然后在您的地图中,您可以:
Seq.map(fun row -> {id=row.id;name=row.name})

并且将其作为IEnumerable返回到您的C#代码中。

我刚刚也有同样的想法。 - narain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接