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