2014-02-23 3 views
4

학습 연습으로 F # 및 F #의 유형 공급자 기능을 사용하여 5000 줄의 csv 파일에 대한 데이터 분석을 수행하고 있습니다. 필자가 f #에서 유형 공급자 생성 유형을 사용하면 자연스럽게 csv 파일의 헤더 행이 해당 유형의 필드 이름이됩니다.F #/C# 경계에서 필드 이름 유지

type restaurantCsv = CsvProvider<"C:\Users\Paul\Desktop\HealthDepartment\RestaurantRatings2013.csv",HasHeaders=true> 

type RawInspectionData(filename : string) = 
    member this.allData = restaurantCsv.Load(filename) 

    member public this.inspectionsList = this.allData.Data.ToList() 

    member this.FilterByName(name : string) = 
     this.allData.Data 
      |> Seq.filter (fun x -> x.EstablishmentName.Contains(name)) 

또한 C# 파일을 테스트하는 장치에서 F # 코드 (위 코드가 생성 한 라이브러리에서)를 호출합니다. 그것은 잘 작동합니다. 그러나 F #이 FilterByName에서 반환하는 IEnumberable을 사용하면 필드 이름 정보가 보존되지 않습니다. 은 F # -generated 유형의 필드 이름을 인식하는 C#을 얻을 수있는 방법을

var inspectionsOnCafes = inspections2013.FilterByName("Cafe"); 
var inspections = (from row in inspectionsOnCafes 
        select new 
        { 
         inspectorID = row.Item3, 
         restaurantName = row.Item5, 
         inspectionDate = row.Rest.Item6 
        }).ToList(); 

내 질문 있나요 : 그래서 튜플 등에서 .Item1, 항목 2, 새로운 필드 이름을 매핑 코드를 그래서 행을 매핑 할 필요가 없습니다. 항목 #은 읽기 쉬운 필드 이름으로?

inspectorID = row.InspectorID, 
// etc. 

주 : 즉, 나는 다음과 같은 코드를 가질 수있는 방법은 내가 How do I create an F# Type Provider that can be used from C#? 보았지만 카메론 Taggert의 질문 토마스 Petricek의 대답은 유형 제공자의 약간 다른 측면에있을 나에게 보인다. 비록 그들이 spot-on이라 할지라도, 나는 그것을 얻지 못하므로 좀 더 많은 도움이 필요합니다.

+1

다니엘이 말했듯이이 작업을하려면'CsvProvider'를 생성 유형 공급자로 변경해야합니다. 이것은 우리가 생각해 왔던 것이지만 실제로 그것을 할 수있는 시간을 찾지 못했습니다 ... 그러나 좋을 것입니다! –

+0

글쎄, 너희들은 이미 열심히 노력하고있어, 전체 공동체가 그것을 높이 평가한다. 앞으로의 릴리스에서 이것을 볼 수 있기를 희망합니다. 그러나 거기에는 많은 "멋진 기능"이 있으며, 모든 기능을 한 번에 완료 할 수는 없습니다. 감사. – philologon

+0

감사! 나는 또한 우리가 항상 지역 사회의 다른 사람들로부터 기부금을 환영한다고 언급해야한다 ;-) –

답변

2

F #에는 두 가지 종류의 유형 공급자가 있습니다. 좀 더 보편적이고 간단한 것들은 지워지는 유형 공급자입니다. 그리고 더 복잡한 것들은 생성 형 제공자입니다.

  • 삭제 된 유형의 공급자가 단지 컴파일러 마법 : 때문에

    구별은, C#을 위해 매우 중요하다. 이는 코드가 올바른지, 밑에있는 API를 올바르게 사용하고 있는지 확인하는 방법입니다. 그러나 이것은 컴파일 타임에만 적용되며 유형은 생성되지 않습니다.. 대신 언더 레이 형식이 내부 표현으로 사용됩니다. 이런 종류의 타입 제공자는 C#에서 사용하기 매우 편리하지 않습니다. 왜냐하면 C#에서는 오직 언더 레이 타입 만 가져 오기 때문입니다.

  • 생성 형 공급자는 컴파일 타임에 진정한 코드 생성 단계입니다. 이 경우 유형이으로 생성되므로 실제로 어셈블리에 존재하며 C#에서 사용할 수 있습니다.

하나가 삭제 유형의 공급자로부터 기대 정확히 것입니다 설명하는 문제. 반면 언더 레이 형식은 튜플이지만 클래스 나 레코드와 같은 좋은 형식은 생성되지 않습니다. 그리고 유형 제공자가 생성 유형 공급자와 다르게 작성되지 않는 한 C#에서 F # 이름을 사용할 수 없습니다.