2013-02-05 4 views
2

헤더가 정보의 세부 경로에 표시 될 순서를 나타내는 CSV 파일이 있습니다. 예는 다음과 같습니다fileHelpers 라이브러리를 사용하여 CSV의 열 헤더를 읽습니다.

COLUMN1,COLUMN2,COLUMN3 
VALUE1,VALUE2,VALUE3 

뿐만 아니라

COLUMN2,COLUMN3,COLUMN1 
VALUE2,VALUE3,VALUE1 

클래스는이

public class CSVImportLineItem 
{ 
    public string Column1 {get; set;} 
    public string Column2 {get; set;} 
    public string Column3 {get; set;} 
} 

과 같을 것이다의 헤더를 읽을 수있는 (FileHelpers 사용) 방법이 있나요 될 수 있으며, 그런 다음 헤더 순서에 따라 속성에 매핑을 결정합니까?

+0

어떤 속성에 매핑하나요? – LukeHennerley

+0

속성은 열 머리글과 이름이 같지만 나타나는 순서는 다양합니다. –

+0

예, 어디서? 반에서 나는 그것을 가져 간다? 우리는 귀하의 질문에서 이러한 속성의 범위를 가지고 있지 않습니다 :) – LukeHennerley

답변

1

특별히 FileHelpers 라이브러리를 사용해야하는 이유가 무엇인가요?

//Use File.ReadAllLines(); 
    List<string> lines = new List<string>() { "Column1, Column2, Column3", "1,2,3" }; 
    var cols = lines.First().Split(','); 
    List<CSVImportLineItem> imported = new List<CSVImportLineItem>(); 
    var v = lines.Skip(1).ToList().Select(line => 
    { 
     CSVImportLineItem item = new CSVImportLineItem(); 
     var values = line.Split(','); 
     for (int i = 0; i < cols.Count(); i++) 
     { 
     item.GetType().GetProperty(cols[i].Trim()).SetValue(item, values[i], null); 
     } 
     return item; 
    }).ToList(); 
+1

Filehelpers는 필자가 필요로하는 견고성을 가지고 있으며, 가변 헤더로 작업하는 기능이 누락되었습니다. –

+0

@WilliamHurst 특히이 섹션에서는 위의 작업을 수행 할 수없는 이유가 무엇입니까? – LukeHennerley

1

ClassBuilder helper classes 중 하나를 사용할 수 있습니다.

DelimitedClassBuilder cb = new DelimitedClassBuilder("LineItem"); 
// First field 
cb.AddField("Column2", typeof(string)); 
// Second field 
cb.AddField("Column1", typeof(string)); 
// Third field 
cb.AddField("Column3", typeof(string)); 

engine = new FileHelperEngine(cb.CreateRecordClass()); 
LineItem[] lineItems = engine.ReadFile("FileIn.txt") as LineItem[]; 

첫 번째 줄의 내용 (FileHelpers 외부에서 읽을 수 있음)을 기준으로 필드 순서를 변경할 수 있습니다.

참조 : the answer here.

관련 문제