У меня есть последовательность, сгенерированная CsvProvider:
RD;RT;RC;RDT;RG;H;HA;HS;RSP;RFP;RCT;RPZ;HR;HT;RCID
Schema="String,String,String,String,String,String,int,String,String,String,int,String,int,String,String"
, которая может содержать равные ранги в позиции "e: int".
module SOQN =
open System
let ordinalRanks input =
input
// |> Seq.sortBy (fun (_, _, _, _, e, _) -> e)
|> Seq.groupBy (fun (a, b, c, _, e, _) -> (a, b, c, e))
|> Seq.mapi (fun i a b c d e f -> (a, b, c, d, i + 1, f))
[<EntryPoint>]
let main() =
let input = seq [ (2107, "HVST", "1315", "Alpha", 1, "JS");
(2107, "HVST", "1315", "Beta", 2, "ASC");
(2107, "HVST", "1315", "Gamma", 2, "ASC");...
(2237, "ABCD", "0905", "Pi", 1, "ABC");
(2237, "ABCD", "0905", "Sigma", 1, "CDE");
(2237, "ABCD", "0905", "Delta", 2, "EFG");...
]
let output = ordinalRanks input
printfn "%A" output
// Actual Output
// seq [ (2107, "HVST", "13-15", "Alpha", 1, "JS");
// (2107, "HVST", "13-15", "Beta", 2, "ASC");
// (2107, "HVST", "13-15", "Gamma", 2, "ASC");...]
// (2237, "ABCD", "0905", "Pi", 1, "ABC");
// (2237, "ABCD", "0905", "Sigma", 1, "CDE");
// (2237, "ABCD", "0905", "Delta", 2, "EFG");...
// Expected Output
// seq [ (2107, "HVST", "13-15", "Alpha", 1, "JS");
// (2107, "HVST", "13-15", "Beta", 2, "ASC");
// (2107, "HVST", "13-15", "Gamma", 3, "ASC");...]
// (2237, "ABCD", "0905", "Pi", 1, "ABC");
// (2237, "ABCD", "0905", "Sigma", 2, "CDE");
// (2237, "ABCD", "0905", "Delta", 3, "EFG");...
//
Как сортировать, используя Порядковые ранги . Обратите внимание, что рейтинги находятся в группах, определяемых первыми тремя позициями. Посоветуйте пожалуйста?
// RD;RT;RC;RDT;RG;H;HA;HS;RSP;RFP;RCT;RPZ;HR;HT;RCID
let sortedData (inputCsv: String) =
let csvInput = Sample2Sort.Load(inputCsv)
let csvHeaders = [| sprintf "%s" ((csvInput.Headers.Value) |> String.concat ";") |]
let csvOutput =
csvInput.Rows
|> Seq.filter (fun row -> row.RFP > 0)
|> Seq.sortBy (fun row -> (DateTime.Parse(row.RD)), row.RC, row.RT, row.RFP)
// |> Seq.groupBy (fun (a, b, c, _, _, _) -> (a, b, c))
|> Seq.groupBy (fun (a, b, c, _, _, _) -> (row.RD, row.RC, row.RT))
// |> Seq.collect (fun (_, group) -> group |> Seq.mapi (fun i (a, b, c, d, _, f) -> a, b, c, d, i + 1, f))
|> Seq.collect (fun (_, group) ->
group |> Seq.mapi (fun i (a, b, c, d, _, f) ->
row.RCID, row.RC, ((row.RD, " ", row.RT) |> String.Concat)), row.RH, i + 1, row.HT)
(csvHeaders, csvOutput)