2013-01-24 2 views
1

이 간단한 파일이 있습니다.FileHelpers DelimiterFieldBuilder 문제

first name 1,last name 1 
first name 2 
first name 3,last name 3 
first name 4,last name 4 
  • 사례 1 :

     ExcelStorage provider = new ExcelStorage(typeof(Person)); 
         provider.FileName = "data.csv"; 
         Person[] res = provider.ExtractRecords() as Person[]; 
    

내가 제대로의 데이터를 얻을 수

[DelimitedRecord(",")] 
    public partial class Person 
    { 
     private string firstName; 

     [FieldNullValue("default last name")] 
     private string lastName; 

     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 
    } 

이 코드 :이 클래스를 사용하여 파일에서 데이터를 읽을 배열의 두 번째 요소에는 성 = 기본 성이 있습니다.

  • 사례 2 : 나는 동적으로 구축 유형을 사용하여 데이터를 읽어

     DelimitedClassBuilder cb = new DelimitedClassBuilder("Person2", ","); 
         cb.AddField("firstName", typeof(string)); 
         cb.AddField("lastName", typeof(string)); 
         cb.LastField.FieldNullValue = "default last name"; 
         DelimitedFileEngine engine = new DelimitedFileEngine(cb.CreateRecordClass()); 
         DataTable dt = engine.ReadFileAsDT("data.csv"); 
    

나는 다음과 같은 예외가 얻을 : 구분 기호를 추가 Line: 2 Column: 0. Delimiter ',' not found after field 'firstName' (the record has less fields, the delimiter is wrong or the next field must be marked as optional).

이의이 같은 파일을 변경하자를 두 번째 줄에

first name 1,last name 1 
first name 2, 
first name 3,last name 3 
first name 4,last name 4 
,210
  • 사례 1 : 정적 입력 된 클래스를 사용하여 읽기 : 나는 같은 결과를 얻을 : 읽기 동적으로 생성 된 객체 사용 : 을 그렇지 브레이크 더 이상하지만 거기 않는 기본 사례 2는
  • 성이 기본값 없음, 그냥 ""있습니다.

답변

0

먼저 두 번째 필드를 선택 사항으로 설정해야합니다.

cb.LastField.FieldNullValue = "default last name"; 

그런 다음 쉼표를 추가하지 않아도됩니다.

둘째, 쉼표를 추가하면 동적 런타임 클래스가 빈 필드를 처리하는 방식을 변경해야합니다. ClassBuilderstring.Emptynull으로 처리하지 않습니다 (이것은 클래스를 동적으로 작성하지 않은 첫 번째 접근 방식과 다르기 때문에 버그 일 수 있습니다). 그러나 이것을 처리 할 수있는 간단한 변환기를 제공 할 수 있습니다.

cb.LastField.Converter.TypeName = typeof(NullValueConverter).ToString(); 

여기 컨버터

public class NullValueConverter : ConverterBase 
{ 
    public override object StringToField(string stringSource) 
    { 
     return stringSource; 
    } 

    public override string FieldToString(object fieldValue) 
    { 
     // treat string.empty as null 
     string result = fieldValue.ToString(); 
     if (string.IsNullOrWhiteSpace(result)) 
      return null; 
     return result; 
    } 
} 
코드입니다
관련 문제