我需要将三组信息连接成一个数组,以便计算付款。
数据集1: FromDate,ToDate
2013-04-10,2013-04-16
(我目前正在使用以下内容创建这两个日期之间的日期的二维数组)
let CalculatedLOS : int = ToDate.Value.Subtract(FromDate.Value).Days
let internalArray = Array2D.init CalculatedDays, 3, (fun x -> (AdmissionDateValue.AddDays(x),0,0))
数据集2:这些分隔为:code,date |代码,日期
87789,2013-04-10 | 35444,2013-04-14
数据集3:这些被分隔为日期,不同的代码|日期,不同代码
2013年4月10日,SE | 2013年4月15日,EA
我需要做的是以某种方式将日期与从FromDate和ToDate创建的数组中的相关索引进行匹配,并使用与该日期匹配的代码和不同代码更新第2和第3个位置。
所以我希望最终得到一个看起来像这样的数据集
[2013年4月10日; 87789; SE]
[2013-04-11 ;;]
[2013年4月12日;;]
[2013年4月13日;;]
[2013-04- 14; 87789;]
[2013年4月15日;; EA]
[2013年4月16日;;]
然后,我会遍历此数组以查找某些值并根据每天分配付款。
我在一个循环中尝试使用Array.find来更新2D数组,但我不知道怎么做(下面的代码不工作)但是我真的很困惑这样做,或者即使这是最好的方式。
let differentCodeArray = MyLongString.Value.Split('|')
for i in 0 .. bedStaysArray.Length - 1 do
Array.find(fun elem -> bedStaysArray.[0].ToString() elem) internalArray
如果有更好的方法,也很乐意远离阵列!
答案 0 :(得分:0)
这是一种做法,因为我理解你的问题。代码依赖于'正确'使用的DateFormat。
完整示例,dataset1,dataset2,dataset3是您的给定输入。
//Given data
let dataset1 = "2013-04-10, 2013-04-16"
let dataset2 = "87789,2013-04-10|35444,2013-04-14"
let dataset3 = "2013-04-10,SE|2013-04-15,EA"
//Extract data
let keyValuePair (c:char) (str:string) = let [|a;b|] = str.Split(c) in a,b
let mapTuple fn a = fn (fst a), fn (snd a)
let date1,date2 = keyValuePair ',' dataset1 |> mapTuple System.DateTime.Parse
let data2 =
dataset2.Split('|')
|> Seq.map (keyValuePair ',')
|> Seq.map (fun (code, date) -> System.DateTime.Parse date, code)
|> Map.ofSeq
let data3 =
dataset3.Split('|')
|> Seq.map (keyValuePair ',')
|> Seq.map (fun (date, code) -> System.DateTime.Parse date, code)
|> Map.ofSeq
let rec dateSeq (a:System.DateTime) (b:System.DateTime) =
seq {
yield a.Date
if a < b then yield! dateSeq (a.AddDays(1.0)) b
}
//join data
let getCode data key = match data |> Map.tryFind key with |Some v -> v |None -> ""
let result =
dateSeq date1 date2
|> Seq.map (fun d -> d, getCode data2 d, getCode data3 d)
|> Seq.toList
//Format result
result |> List.iter ((fun (date, code1, code2) -> printfn "[%s;%s;%s]" (date.ToShortDateString()) code1 code2))
控制台输出:
[2013-04-10;87789;SE]
[2013-04-11;;]
[2013-04-12;;]
[2013-04-13;;]
[2013-04-14;35444;]
[2013-04-15;;EA]
[2013-04-16;;]