关于filehelper库的快速问题:
我使用文件助手引擎来读取流,进行验证,如果CSV文件没有标题,我们需要匹配/映射到我的模型:即
id,姓名,年龄,电话,性别, 但CSV可能不会一直以这种格式/顺序出现,我们需要使用每列的下拉列表来匹配它们。
我有什么方法可以做到这一点吗?
Thannks,
答案 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");
然后您可以遍历结果数据表。