我有一个我需要处理的CSV文件,这有点像噩梦。基本上是以下
"Id","Name","Description"
"1","Test1","Test description text"
"2","Test2","<doc><style>body{font-family:"Calibri","sans-serif";}</style><p class="test_class"
name="test_name">Lots of word xdoc content here.</p></doc>"
"guid-xxxx-xxxx-xxxx-xxxx","Test3","Test description text 3"
我正在使用File Helpers库处理CSV而不是重新发明轮子。但是,由于描述字段包含未转义的Word xdoc xml,其中包含引号,当涉及到每条记录的起点和终点时,它会变得相当混乱。
以下是示例映射类。
[DelimitedRecord(","), IgnoreFirst(1), IgnoreEmptyLines()]
public class CSVDoc
{
#region Properties
[FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
public string Id;
[FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
public string Name;
[FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
public string Description;
[FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
}
我考虑过(尽管我讨厌这种任务的正则表达式)用"
替换所有'
,然后使用((?<=(^|',))'|'(?=($|,')))
模式将所有'
替换为{{ 1}}在行的开头和结尾以及格式为"
的位置。但是,脏文件包含一些以','
结尾的行和一些格式为"
所以现在我正试图弄清楚如何做到这一点以及它如何实现自动化。
有什么想法吗?
答案 0 :(得分:0)
你将不得不重新发明轮子,因为那不是有效的CSV或者确实是一个合理的文件 - 它没有任何可证明的一致的逃避规则(例如,我们不知道是否纯文本列是否正确转义)。
你最好的办法就是要求制作此邮件的人修复错误,例如:
"2","Test2","<doc><style>body{font-family:""Calibri"",""sans-serif"";}</style><p class=""test_class""
name=""test_name"">Lots of word xdoc content here.</p></doc>"
你的解析器应该处理得很好,而且它们不应该以简单有效的方式生成。
如果不这样做,你必须手工编写解析器代码:
"
"
{空白,
或空格后面的任何<
。如果在其他行中始终未使用<doc
,则可能更容易查找。或者对于{{1}},如果它始终识别正确的行,则可能。
答案 1 :(得分:0)
如果您之前不介意进行一些预处理,可以将第一个和第二个“,”更改为“|”然后使用FileHelper正常解析文件(假设你没有|在最后一列有HTML标签的地方)
预处理可能类似于(简单伪代码):
var sb = new StringBuilder()
var regex = new Regex("\",\"");
foreach(string line in textFileLines)
{
sb.AppendLine(regex.Replace(line , "\"|\"", 2));
}
答案 2 :(得分:0)
我几个月前就使用过CSV-1203文件格式标准,所以首先要注意的是你没有处理CSV文件 - 即使它被命名为“xyz.CSV”。
正如其他人所说,写自己的读者会更容易,但这并不困难。我也对所有正则表达式都有仇恨,但好消息是你可以编写任何解决方案而无需使用它。
有两件事:Excel对以两个大写字母ID(没有引号)开头的CSV文件做了一件非常奇怪的事情。它认为您的CSV是一个损坏的SYLK文件!试试吧。
有关此问题的详细信息和详细的CSV文件格式规范,请参阅http://mastpoint.curzonnassau.com/csv-1203