2017-11-07 1 views
1

다른 레코드 형식이있는 CSV 파일을 읽고 있습니다.행의 열 수가 다른 CSV 파일

첫 번째 레코드에는 항상 3 개의 열이 있습니다. 헤더입니다.

다른 레코드에는 가변 개수의 열이 있습니다.

구분 기호는 파이프입니다. 열의 길이는 고정되어 있습니다 (각 열 유형은 고정 길이입니다).

내가 FileHelpers와 파일을 CSV의 유형을 분석하기 위해 노력하고있어 :

*|060318|4  
1|Tom  |2 |605212999|02|663790000|02|T3_1018_RM |0 
2|Steve |2 |605212999|02|663790000|02|T3_1018_RM |0 
3|Bob  |1 |605212999|02|T3_1018_RM |0 

CSV 열 :

ID|Name|Telephones Count|TelephoneNumber|TypeTelephone...|IDType|ProductType 

1 호선과 2 개가 2 개 전화기 (수와 유형) :

3 호선에는 전화기 1 개 (번호 및 유형) :

 605212999|02 

FileHelpers 또는 다른 일반 코드를 사용할 수 있습니까?

나는 이런 식으로 비슷한 시도 :

StreamReader sr = new StreamReader(filename); 
var csvList = new List<string[]>(); 
while(!sr.EndOfStream) 
{ 
    String[] header = sr.ReadLine().Split('|'); 
    csv.Add(header); 
} 

사용 FileHelpers하지 FixedLengthRecord 적용

[FixedLengthRecord()] 
public class Customer 
{ 
    [FieldFixedLength(1)] 
    public int Id; 

    [FieldFixedLength(8)] 
    [FieldTrim(TrimMode.Both)] 
    public string Name; 

    [FieldFixedLength(2)] 
    [FieldTrim(TrimMode.Both)] 
    public int TelephoneCount; 

    .... 
    public string Phone1; 
    public byte Phone1Type; 

    public string Phone2; 
    public byte Phone2Type; 

    ... 
    public string Phone9; 
    public byte Phone9Type; 

    [FieldFixedLength(14)] 
    [FieldTrim(TrimMode.Both)] 
    public string IDType; 

    [FieldFixedLength(1)] 
    public int ProductType; 
} 

또는 http://www.filehelpers.net/example/QuickStart/ReadWriteRecordByRecord/ 가변 길이 레코드와 함께 사용할 수 있습니다

답변

1

FileHelpers 적용을 사용하여 . 고정 길이 속성은 다음과 같습니다가 실제 데이터로 구분 기호를 치료하는 것처럼

[FixedLengthRecord(FixedMode.AllowLessChars)] 

내가 비록 고정 길이 방식을 사용하지 않을 것입니다. 그래서 그 대신 당신은 사용할 수 있습니다

[DelimitedRecord("|")] 
public class Customer 
{ 
    public int CustId { get; set; } 

    [FieldTrim(TrimMode.Right)] 
    public string Name { get; set; } 

    [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
    public DateTime AddedDate { get; set; } 

    [FieldOptional] // <-- 
    public string OptionalColumn { get; set; } 

    [FieldOptional] // <-- 
    public string OtherOptionalColumn { get; set; } 
} 

샘플 데이터로 :

StringBuilder data = new StringBuilder(); 
data.AppendLine("12345|PETE PETERSON     |01012001"); 
data.AppendLine("54321|SUSAN SMITH     |11112011|Hello"); 
var customers = new FileHelperEngine<Customer>().ReadString(data.ToString()); 
+0

많은 optionalcolumns있다. 샘플 :'Required Column 1, OptionalColumn1, OptionalColumn 2, ... OptionalColumn N, Required Column 2, Required Column 3' – Kiquenet

+0

@Kiquenet 추가 컬럼의 속성을 지정할 수 있습니다. 그 전에 [[FieldOptional]'속성. 업데이트 된 답변을 참조하십시오. –

+0

*** 전화 번호 ***을 포함하는 열이 있습니다. 예를 들어, *** 2 *** 값, 다음 열은 _ 전화 번호이며 telephone_ ('01, 02 for mobile')입니다. 예를 들면 다음과 같습니다 :'| 2 | 605212115 | 02 | 663794042 | 02 |' – Kiquenet

관련 문제