有什么办法可以使用LinqToCSV并只选择特定的列?使用LinqToCSV - 忽略额外的列?
例如,我需要每天接收一个CSV文件,这个文件可能有一列14个列,也可能在15个月之后。目前我已经将它配置为映射所有14列,但这实际上并不理想,因为我只关心10个。
因此,当引发额外的列时,我得到抛出的TooManyDataFieldsException异常,并且LinqToCSV不会读取CSV文件的任何行。
有什么办法可以使用LinqToCSV并只选择特定的列?使用LinqToCSV - 忽略额外的列?
例如,我需要每天接收一个CSV文件,这个文件可能有一列14个列,也可能在15个月之后。目前我已经将它配置为映射所有14列,但这实际上并不理想,因为我只关心10个。
因此,当引发额外的列时,我得到抛出的TooManyDataFieldsException异常,并且LinqToCSV不会读取CSV文件的任何行。
尝试实现IDataRow界面 - 请参阅"Reading Raw Data Rows"
在这里看到:http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library#EnforceCsvColumnAttribute
为真时,只读读取数据领域进入公众领域和 性能与[CsvColumn]属性,忽略所有其他领域 和属性。并且,只写入公共字段 的内容和具有[CsvColumn]属性的属性。
你需要IgnoreUnknownColumns http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library#IgnoreUnknownColumns
似乎IgnoreUnknownColumns财产做这项工作,
下面的代码我使用:
然后,我从我的资料库检索我的数据:
var myItems = myClassInstance.ListItems().CatchExceptions(ex => Debug.WriteLine(ex.Message));
更多的控制我有一个扩展方法来处理来自灵感的错误: Wrap an IEnumerable and catch exceptions
public static IEnumerable<T> CatchExceptions<T>(this IEnumerable<T> src, Action<Exception> action = null)
{
using (var enumerator = src.GetEnumerator())
{
var next = true;
while (next)
{
try
{
next = enumerator.MoveNext();
}
catch (AggregatedException ex)
{
lock (ex)
{
foreach (var e in ex.m_InnerExceptionsList)
{
if (action != null)
{
action(e);
}
File.AppendAllText(LogFilePath, string.Format("{0}: {1}\r\n", DateTime.Now.ToShortTimeString(), e.Message)); //todo ILogger
}
}
File.AppendAllText(LogFilePath, "-\r\n");
continue;
}
catch (Exception ex)
{
if (action != null)
{
action(ex);
}
lock (ex)
{
File.AppendAllText(LogFilePath, string.Format("{0}: {1}\r\n", DateTime.Now.ToShortTimeString(), ex.Message)); //todo ILogger
}
continue;
}
if (next)
{
yield return enumerator.Current;
}
}
}
}
执行列始终具有相同的名称,虽然有时有些缺失? –
你最终解决了吗?我过去面临同样的问题,我修改了源代码,并在'CsvFileDescription'类中添加了一些有用的属性(如'ReadOnlySpecifiedColumns','Append'等) –