合并f#中的多个数组

时间:2014-01-30 09:50:53

标签: f#

我需要将三组信息连接成一个数组,以便计算付款。

数据集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 

如果有更好的方法,也很乐意远离阵列!

1 个答案:

答案 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;;]