0

我有一个 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)]
}

我考虑过(尽管我讨厌这种任务的正则表达式)替换所有"'然后使用模式((?<=(^|',))'|'(?=($|,')))在行的开头和结尾以及它们被格式化的地方替换所有。但是,脏文件包含一些以 a 结尾的行和一些格式化的 css 样式属性'"','"","

所以现在我只能摸不着头脑,试图弄清楚如何做到这一点以及如何实现自动化。

有任何想法吗?

4

3 回答 3

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. 检查未转义的 " ("后面没有"a,或空格的任何内容。
  3. 如果没有找到,则解析为 CSV。
  4. 如果找到任何东西,请解析为这个可怕的东西,直到你打到以 " 结尾的行

<如果在其他行中始终不使用它,则可能更容易查找。或者,<doc如果它始终如一地识别正确的行。

于 2012-08-31T11:26:47.127 回答
0

如果不介意之前做一些预处理,可以把第一个和第二个“,”改成“|” 然后使用 FileHelper 正常解析文件(假设你没有 | 在有 HTML 标签的最后一列)

预处理可能类似于(简单伪代码):

var sb = new StringBuilder()
var regex = new Regex("\",\"");
foreach(string line in textFileLines)
{
   sb.AppendLine(regex.Replace(line , "\"|\"", 2));
}
于 2012-08-31T11:32:15.423 回答
0

几个月前,我研究了 CSV-1203 文件格式标准,所以首先要意识到的是,您处理的不是 CSV 文件——即使它被命名为“xyz.CSV”。

正如这里其他人所说,编写自己的阅读器会更容易,它们并不太难。我也讨厌所有正则表达式,但好消息是您可以编写任何解决方案而无需使用它。

有几件事:Excel 对以两个大写字母 ID(不带引号)开头的 CSV 文件做了一件非常奇怪的事情。它认为您的 CSV 是损坏的 SYLK 文件!尝试一下。

有关此问题的详细信息和详细的 CSV 文件格式规范,请参阅http://mastpoint.curzonnassau.com/csv-1203

于 2012-09-02T13:53:04.997 回答