2014-01-30 2 views
0

나는 지불을 계산할 수 있도록 하나의 배열에 합쳐야하는 정보가 3 세트 있습니다.f에 여러 배열 병합 #

데이터 세트 1 FROMDATE, TODATE

2013년 4월 10일,

2013년 4월 16일 (I 현재 사용하여 이러한 두 날짜들 사이의 날짜들의 2 차원 배열을 생성하고있어

let CalculatedLOS : int = ToDate.Value.Subtract(FromDate.Value).Days 
let internalArray = Array2D.init CalculatedDays, 3, (fun x -> (AdmissionDateValue.AddDays(x),0,0)) 

데이터 집합)이 다음이하는 것은으로 구분됩니다 코드, 날짜 | 코드, 날짜

87789,2013-04-10 | 35444,2013-04-14

데이터 세트 3 :이이 날짜, differentcode로 분리 | 날짜, differentcode

2013년 4월 10일, SE | 2013년 4월 15일, EA

내가해야 할 것은 FROMDATE에서 생성 된 배열의 해당 인덱스 날짜를 일치 어떻게 든

ToDate를 수행하고 두 번째 및 세 번째 위치를 해당 날짜와 일치하는 코드 및 다른 코드로 업데이트합니다.

그래서 나는 희망이

[2013년 4월 10일처럼 보였다 데이터 집합으로 끝날 것이다 87789; SE]
[2013-04-11 ;;]
[2013-04-12 ;;]
[2013-04-13 ;;]
[2013-04-14; 87789;]
[2013-04-15 ;; EA]
[2013-04-16 ;;]

그런 다음이 배열을 반복하여 일부 값을 조회하고 매일을 기준으로 지불금을 지정합니다.

2 차원 어레이를 업데이트하기 위해 루프 내에서 Array.find를 시도했지만 그 코드를 수행하는 방법을 모르겠다. (아래 코드는 이 아니지만이 작동 함) 또는 이것이 최선의 방법 일지라도.

let differentCodeArray = MyLongString.Value.Split('|') 
for i in 0 .. bedStaysArray.Length - 1 do 
    Array.find(fun elem -> bedStaysArray.[0].ToString() elem) internalArray 

더 좋은 방법이 있다면 배열에서 멀리 떨어져있게되어 기쁩니다.

+0

이 올바른 인덱스를 만드는 게임이다. 당신이 그들을 만들면 중간 구조를 제거 할 수 있습니다 : 한 부분은 조회를 만들고, 다른 부분은 그것을 사용하는 '비즈니스 논리'를가집니다. – nicolas

+0

일단 데이터를 파싱하면 인덱스를 처리 할 수있는 Deedle 시계열로 데이터를로드 할 수 있어야합니다. http://bluemountaincapital.github.io/Deedle/timeseries.html –

답변

0

여기에 귀하의 질문을 이해하는 한 가지 방법이 있습니다. 이 코드에는 '올바른'DateFormat beeing에 대한 의존성이 있습니다.

전체 예제 인 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;;] 
+0

정말 잘 작동 한 Yodiz에게 감사드립니다. "이 표현식에서 불완전한 패턴 일치"라는 경고가 나타납니다.예를 들어 '[| _; _; 패턴에 의해 다루어지지 않는 경우를 나타낼 수 있습니다. "이 문제에 관심을 가져야합니까? – ct1

+0

소량의 우려로 사람이 죽은 적은 결코 없었습니다. :)이 줄의 의미는 'let [| a ; b |] = str.Split (c) a, b '에서 문자열에 세 개의 쉼표로 구분 된 값이 들어 있으면 예외가 발생합니다. – Yodiz