FileHelpers - 列映射

时间:2014-08-22 13:15:29

标签: c# stream filehelpers

关于filehelper库的快速问题:

我使用文件助手引擎来读取流,进行验证,如果CSV文件没有标题,我们需要匹配/映射到我的模型:即

id,姓名,年龄,电话,性别,  但CSV可能不会一直以这种格式/顺序出现,我们需要使用每列的下拉列表来匹配它们。

我有什么方法可以做到这一点吗?

Thannks,

2 个答案:

答案 0 :(得分:1)

简短的回答,没有。但是你可以动态创建一个依赖类:

由于您的JSON文件中包含可能的字段列表,因此我建议为第一个数据行执行基本的System.IO ReadLine,然后通过分隔符解析各个标头。即:

string headerString;
var headers = new List<String>();

var file = new System.IO.StreamReader("C:\\myFile.txt");
headerString = file.ReadLine();
file.Close();

headers = headerString.Split(',').ToList();

现在您有第一行的字符串列表与您的JSON文件匹配。然后,您可以使用System.Reflection.Emit(下面引用的链接)

创建您的依赖类
typeBuilder.SetParent(typeof(MyFileHelperBaseClass));
// can place the property definitions in a for loop against your headers
foreach(string h in headers){
    typeBuilder.DefineProperty("<header/col#>", ..., typeof(System.Int32), null);
}

stackoverflow article 14724822: How Can I add properties to a class on runtime in C#?

文件助手有时会有点挑剔,所以需要一些调整。

希望这有帮助

答案 1 :(得分:0)

您可以使用File.ReadLines(@"C:\myfile.txt").First()阅读第一行并获取标题。

然后您可以使用FileHelpers CodeBuilder来构建运行时类。从分隔的csv文件的示例:

DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ",");
cb.IgnoreFirstLines = 1;
cb.IgnoreEmptyLines = true;

cb.AddField("BirthDate", typeof(DateTime));
cb.LastField.TrimMode = TrimMode.Both;
cb.LastField.FieldNullValue = DateTime.Today;

cb.AddField("Name", typeof(string));
cb.LastField.FieldQuoted = true;
cb.LastField.QuoteChar = '"';

cb.AddField("Age", typeof(int));

engine = new FileHelperEngine(cb.CreateRecordClass());

DataTable dt = engine.ReadFileAsDT("testCustomers.txt");

然后您可以遍历结果数据表。