Назначить индексы для чтения строк CSV в запросе F #

#csv #f# #type-providers #query-expressions

#csv #f# #тип-поставщики #запрос-выражения

Вопрос:

Какой самый простой способ добавить индексы к прочитанному содержимому файла CSV / TSV, считываемого с CsvProvider помощью и query выражения?

У меня есть разделенный табуляцией файл, содержащий тысячи заказов, которые регулярно необходимо считывать, и соответствующие заказы — это те, которые являются самыми последними, не записанными в определенную базу данных. Заказы не индексируются и не имеют временных меток, поэтому мне приходится делать перекрестные ссылки, чтобы увидеть, какие заказы еще не были записаны в базу данных. Я хотел бы проиндексировать их, чтобы я мог найти самый новый заказ, не записанный в БД, а затем выбрать все строки, включая и после этого (файл записывается последовательно третьей стороной, поэтому самые новые заказы будут строками, расположенными дальше всего в файле), но я не вижу очень простогопока что это можно сделать в одном выражении запроса.

 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?*)
}
  

Как бы я проиндексировал их как таковые?

Ответ №1:

Вы можете использовать Seq.indexed для преобразования последовательности data.Rows в последовательность кортежей, где первым элементом является индекс на основе нуля, а вторым элементом является строка:

 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")]