数据处理难题/头痛

时间:2012-08-31 11:10:43

标签: c# csv

我有一个我需要处理的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}}在行的开头和结尾以及格式为"的位置。但是,脏文件包含一些以','结尾的行和一些格式为"

的css样式属性

所以现在我正试图弄清楚如何做到这一点以及它如何实现自动化。

有什么想法吗?

3 个答案:

答案 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>"

你的解析器应该处理得很好,而且它们不应该以简单有效的方式生成。

如果不这样做,你必须手工编写解析器代码:

  1. 阅读一行。
  2. 检查未转义的“(" " {空白,或空格后面的任何<
  3. 如果未找到,请解析为CSV。
  4. 如果发现任何一个,解析为这个可怕的事情,直到你用“
  5. 结尾

    如果在其他行中始终未使用<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