分配索引以读取 F# 查询中的 CSV 行

Assign indexes to read CSV rows in F# query

向使用 CsvProviderquery 表达式读取的 CSV/TSV 文件的读取内容添加索引的最简单方法是什么?

我有一个制表符分隔的文件,其中包含经常需要阅读的数千条订单,相关订单是最近写入某个特定订单的订单数据库。这些订单没有索引,也没有时间戳,所以我必须交叉引用以查看哪些订单尚未写入数据库。 我想对这些进行索引,这样我就可以找到写入数据库的最新订单 not 然后 select 所有行,包括之后的行(文件按顺序写入第 3 方,所以最新的订单将是文件中最下方的行),但到目前为止,我没有看到在单个查询表达式中执行此操作的非常简单的方法。

let data = new CsvProvider<fileLocation>()
let allOrders = query {
    for row in data.Rows do
    select row (*perhaps something like a "select (index, row)" here?*)
    (*how do I increment the index in the expression?*)
}

我如何将它们编入索引?

您可以使用 Seq.indexed 将序列 data.Rows 转换为元组序列,其中第一个元素是 zero-based 索引,第二个元素是行:

let allOrders = query {
    for index, row in Seq.indexed data.Rows do
    where (index < threshold)
    select row
}

为了说明 Seq.indexed 的工作原理:

> let xs = ["a"; "b"; "c"; "d"]
> Seq.indexed xs
val it : seq<int * string> = seq [(0, "a"); (1, "b"); (2, "c"); (3, "d")]