阅读带有双引号的csv与lumenwork csv阅读器

我正在使用Lumenworks csv阅读器阅读csv文件。 以下是一个示例记录

"001-0000265-003"|"Some detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6" 

我用下面的构造函数创建了一个类来读取这个文件

 using (var input = new CsvReader(stream, true, '|')) { //logic to create an xml here } 

当细节内没有双引号时,这很好用。 但是当scinarios像这样

 "001-0000265-003"|"Some " detail"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6" 

读者抛出exception

 An unhandled exception of type 'LumenWorks.Framework.IO.Csv.MalformedCsvException' occurred in LumenWorks.Framework.IO.dll 

那么我使用了带有7个参数的CsvReader构造函数,

 CsvReader(stream, true, '|', '"', '"', '#', LumenWorks.Framework.IO.Csv.ValueTrimmingOptions.All)) 

但我仍然得到同样的错误。 请提供任何建议。

我正在阅读一些复杂的文件如下,

 "001-0000265-003"|"ABC 33"X23" CDE 32'X33" AAA, BB'C"|"detal1"|"detail2"|"detal3"|"detail4"|"detail5"|"detail6" 

我已经使用您的示例数据对其进行了测试,并且很难修复这个格式错误的行(来自Catch -block的fe)。 所以我不会使用引号字符,而只是使用管道分隔符并删除"稍后通过csv[i].Trim('"')

这是一个解析文件并返回所有行的字段的方法:

 private static List> GetAllLineFields(string fullPath) { List> allLineFields = new List>(); var fileInfo = new System.IO.FileInfo(fullPath); using (var reader = new System.IO.StreamReader(fileInfo.FullName, Encoding.Default)) { Char quotingCharacter = '\0'; // no quoting-character; Char escapeCharacter = quotingCharacter; Char delimiter = '|'; using (var csv = new CsvReader(reader, true, delimiter, quotingCharacter, escapeCharacter, '\0', ValueTrimmingOptions.All)) { csv.DefaultParseErrorAction = ParseErrorAction.ThrowException; //csv.ParseError += csv_ParseError; // if you want to handle it somewhere else csv.SkipEmptyLines = true; while (csv.ReadNextRecord()) { List fields = new List(csv.FieldCount); for (int i = 0; i < csv.FieldCount; i++) { try { string field = csv[i]; fields.Add(field.Trim('"')); } catch (MalformedCsvException ex) { // log, should not be possible anymore throw; } } allLineFields.Add(fields); } } } return allLineFields; } 

使用包含示例数据的文件进行测试和输出:

 List> allLineFields = GetAllLineFields(@"C:\Temp\Test\CsvFile.csv"); foreach (List lineFields in allLineFields) Console.WriteLine(string.Join(",", lineFields.Select(s => string.Format("[{0}]", s)))); [001-0000265-003],[Some detail],[detal1],[detail2],[detal3],[detail4],[detail5],[detail6] [001-0000265-003],[Some " detail],[detal1],[detail2],[detal3],[detail4],[detail5],[detail6]