2012-07-04 3 views
0

저는 F #에 대해 매우 익숙합니다. 약간의 문제로 머리를 긁적니다. 나는 string list list이 내가 조작하고 변형하려고 노력하고있어. 이것은 아마 사소한 일입니다.문자열 목록 나누기

는 다음과 같은 데이터는 CSV 파일에서 읽고있는 :

1,ABC,3 
1,DEF,3 
1,XYZ,1 
2,ABC,2 
2,XYZ,1 
3,DEF,2 
3,XYZ,2 

옳고 그름, 나는 string list list에 읽고 있어요. 이 데이터는 비 정규화 된 데이터 세트를 나타내며 각 레코드의 인덱스 0의 필드는 식별자 필드입니다. 순간 난 그냥 나타내는 string list list list으로 끝낼 수 있도록 외부 목록을 분할하기 위해 노력하고있어 다음

1,ABC,3  2,ABC,2  3,DEF,2 
1,DEF,3  2,XYZ,1  3,XYZ,2 
1,XYZ,1 

위의 결과는 다음 나머지에 내 형식화 된 모델로 밀어 공급됩니다 응용 프로그램의

답변

1

:

csvRecords 
|> Seq.groupBy (fun record -> (record.Item 0)) 
|> List.ofSeq 
|> List.map(toTypedModel) 

record.Item 0는 목록의 첫 번째 요소를 얻을 수있는 좋은 방법이 아니다. 그 목적으로 List.head 또는 패턴 일치를 사용해야합니다. 같은

귀하의 예를 보일 것이다 : 나는 또한 순서에 toTypedModel를 사용하는 순서를 변경

csvRecords 
|> Seq.groupBy List.head 
|> Seq.map toTypedModel 
|> List.ofSeq 

, 그것은 불필요한 목록을 할당하지 않도록하는 데 도움이됩니다.

+0

그건 의미가 있습니다. 나는 그걸로갔습니다. 'List.head'가 자리에 있습니다! – SaxonMatt

1

사용 Seq.groupby - 당신의 코드에서

input 
|> Seq.groupBy (fun (a,b,c) -> a) 
|> Seq.toList 
+0

감사합니다. 존 - 이미'Seq.groupBy'를 사용 했었지만, 2 개의 튜플리스트는 완전히 나를 통해 돌아 왔습니다. 이후 튜플에 대처하는 방법에 대해 더 많이 이해 했으므로 답변에 돌아가는 것이 트릭을 완료했습니다! 이 함수의 결과가 매핑 된 함수에서 튜플을 부분으로 분해합니다. 나는 그것이 사소한 것임을 알았다. – SaxonMatt

+0

@JohnPalmer :'List.toSeq'는 불필요하며'Seq.GroupBy/Seq.Groupby'는 잘못된 경우입니다. – pad

+0

@pad - 컴파일러로 테스트하지 않으면 어떻게됩니까? –