Ты почти у цели.Но ваша последняя строка с (name, price)
не совсем верна.Когда вы звоните Seq.head data
, что означает data
в этот момент?Ответ: список строк.Так что Seq.head
даст вам одну строку CSV.Вы не можете сопоставить строку CSV с (name, price)
кортежем, и это то, что говорит вам сообщение об ошибке.Поскольку вход представляет собой строку, он ожидал функцию, которая принимает ((yr, mon), row)
, а вы дали ей ((yr, mon), (name, price))
.
В вашем случае, я бы, вероятно, сделал резервную копию шага и вместо того, чтобы просто сделать Seq.head data
и вставив это в другое Seq.map
, я бы сделал это за одну операцию.Я покажу вам свои предложения по одному шагу за раз.Во-первых, вот код, который вы написали и который выдает ошибку:
let data =
Datacsv.GetSample().Rows
|> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
|> Seq.map (fun ((yr,mon),data) -> ((yr, mon), Seq.head data))
|> Seq.map (fun ((yr,mon),(name,price))
Моя первая мысль: наличие в вашем коде двух разных вещей с именем data
может привести к путанице.Итак, давайте изменим имя переменной в первом Seq.map
.То, что вы назвали data
в этой функции, представляет собой последовательность строк, поэтому давайте назовем ее rows
вместо этого:
let data =
Datacsv.GetSample().Rows
|> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
|> Seq.map (fun ((yr,mon),rows) -> ((yr, mon), Seq.head rows))
|> Seq.map (fun ((yr,mon),(name,price))
Теперь мы исправим второй Seq.map
, удалив его иобъединяя его операцию с первым Seq.map
следующим образом:
let data =
Datacsv.GetSample().Rows
|> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
|> Seq.map (fun ((yr,mon),rows) ->
let row = Seq.head rows
((yr, mon), (row.NAME, row.PRICE)))
Обратите внимание, что я предполагаю, что, поскольку ваш CSV-файл содержит столбец с именем DATE
во всех заглавных буквах (который был переведен в *Свойство 1028 * для объектов строки в F #), оно также содержит столбцы NAME
и PRICE
во всех заглавных буквах.Если эти столбцы называются как-то иначе, измените части кода row.NAME
и row.PRICE
соответственно.