2016-07-30 3 views
3

CSV 파일의 데이터를 내 데이터 구조에 매핑하는 데 CsvTypeProvider를 사용하고 있습니다. 그것을 위해 내가 매핑 기능마다 반복해야 제외하고는이, 화려하게 작동합니다F # CsvTypeProvider - 유추 된 유형의 매핑 함수

type GamesFile = CsvProvider<"./data/15.csv"> 
let games15 = GamesFile.Load("./data/15.csv").Rows |> Seq.map (fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 
let games16 = GamesFile.Load("./data/16.csv").Rows |> Seq.map (fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 

나는 함수로 이동하려고, 나는 불확정 형의 객체에 대한 조회이 이전 정보를 기반 "고 말했다 있어요 프로그램 포인트.이 프로그램 포인트 이전에 유형 주석을 사용하여 객체의 유형을 제한해야 할 수 있습니다. 그러면 조회가 해결 될 수 있습니다. "

이 점이 의미가 있지만 어떻게 CSV 내용에서 유형을 추론 할 때 매핑 유형을 알 수 있습니까? 어떻게 정상적으로 해결됩니까?

+1

은 그냥 IDE에서 c''에 마우스를 가져가, 그것은 당신에게 유형을 표시합니다. 또한 형식이 정의 된 위치에 대한 혼란을 해결합니다. –

+1

@FyodorSoikin 형식 제공자를위한 tootip은 형식 별칭을 무시하기 때문에 다소 혼란 스럽습니다 .. –

답변

5

형식 공급자는 행을 나타내는 형식을 생성하며이 형식을 기본 제공 형식의 중첩 형식으로 표시합니다.이 경우 별칭은 GamesFile입니다. 편집자가 그래서 별명의 이름을 표시하지 않습니다
CsvFile<...>.Row 같은과 툴팁이 표시됩니다 때문에

이것은 완전히 명확하지 않다, 그러나 중첩 타입을 시사한다. 코드에서 유형을 사용하려면, 당신은 단지 GamesFile.Row을 작성할 수 있습니다, 그래서 당신은이 같은 필요

type GamesFile = CsvProvider<"./data/15.csv"> 

let mapRows (rows:seq<GamesFile.Row>) = 
    rows |> Seq.map (fun c -> 
    { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 

let games15 = GamesFile.Load("./data/15.csv").Rows |> mapRows 
let games16 = GamesFile.Load("./data/16.csv").Rows |> mapRows 
+1

'GamesFile 대신'CsvProvider < "./ data/15.csv">. 행을 쓸 수 있습니까? . 로우? –

+0

나는 할 수 있다고 믿지만 나에게 좋은 생각처럼 들리지 않는다 :-) –

+0

여전히 우아하지는 않더라도, 적어도 "실행할 수있는"솔루션이 될 것이다. –