2013-02-05 34 views
2

我有一个CSV文件,其中的标题指示信息将在哪些顺序中显示在详细信息行中。一个例子是:使用fileHelpers library阅读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