【发布时间】:2015-12-07 02:01:38
【问题描述】:
根据FileHelpers 3.1 example,您可以使用 FileHelpers.Detection.SmartFormatDetector 类自动检测 CSV 文件格式。
但是这个例子没有更进一步。您如何使用这些信息来动态解析 CSV 文件?它一定与 DelimitedFileEngine 有关,但我不知道如何。
更新:
我想出了一个可能的方法,但不得不求助于反射(感觉不对)。还有其他/更好的方法吗?也许使用 System.Dynamic?无论如何,这是我到目前为止的代码,它不是很漂亮,但它可以工作:
// follows on from smart detector example
FileHelpers.Detection.RecordFormatInfo lDetectedFormat = formats[0];
Type lDetectedClass = lDetectedFormat.ClassBuilderAsDelimited.CreateRecordClass();
List<FieldInfo> lFieldInfoList = new List<FieldInfo>(lDetectedFormat.ClassBuilderAsDelimited.FieldCount);
foreach (FileHelpers.Dynamic.DelimitedFieldBuilder lField in lDetectedFormat.ClassBuilderAsDelimited.Fields)
lFieldInfoList.Add(lDetectedClass.GetField(lField.FieldName));
FileHelperAsyncEngine lFileEngine = new FileHelperAsyncEngine(lDetectedClass);
int lRecNo = 0;
lFileEngine.BeginReadFile(cReadingsFile);
try
{
while (true)
{
object lRec = lFileEngine.ReadNext();
if (lRec == null)
break;
Trace.WriteLine("Record " + lRecNo);
lFieldInfoList.ForEach(f => Trace.WriteLine(" " + f.Name + " = " + f.GetValue(lRec)));
lRecNo++;
}
}
finally
{
lFileEngine.Close();
}
【问题讨论】:
-
动态不只是意味着它使用了反射和后期绑定吗?反射总是会影响性能,因此唯一的其他方法是使用 Linq 表达式
标签: parsing csv dynamic flat-file filehelpers