2012-09-10 38 views
3

有什么办法可以使用LinqToCSV并只选择特定的列?使用LinqToCSV - 忽略额外的列?

例如,我需要每天接收一个CSV文件,这个文件可能有一列14个列,也可能在15个月之后。目前我已经将它配置为映射所有14列,但这实际上并不理想,因为我只关心10个。

因此,当引发额外的列时,我得到抛出的TooManyDataFieldsException异常,并且LinqToCSV不会读取CSV文件的任何行。

+0

执行列始终具有相同的名称,虽然有时有些缺失? –

+0

你最终解决了吗?我过去面临同样的问题,我修改了源代码,并在'CsvFileDescription'类中添加了一些有用的属性(如'ReadOnlySpecifiedColumns','Append'等) –

回答

1

似乎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; 
       } 
      } 
     } 
    }