C# 数据处理难题/头痛
我有一个CSV文件,我需要处理这是一个噩梦位。本质上是这样的C# 数据处理难题/头痛,c#,csv,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 co
"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"
我考虑过(尽管我讨厌这种任务的正则表达式)用
“
替换所有”
,然后使用(?你必须重新发明轮子,因为那不是有效的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>"
“2”、“Test2”、“body{font-family:”Calibri“,”sans serif“;}这里有很多word xdoc内容。
“
您的解析器应该能够很好地处理这些问题,并且以一种简单高效的方式生成这些问题并不困难
否则,您必须手动将解析器编码为:
读一行
检查是否有未被替换的“(任何”
,后面没有”
a、
或空白
如果未找到,则解析为CSV
如果找到任何,请将其解析为这个可怕的东西,直到您到达以“结尾的行”
如果您不介意先做一些预处理,那么查找可能会更容易,您可以将第一个和第二个“,”更改为“|”,然后使用FileHelper正常解析文件(假设最后一列中没有|,其中有HTML标记)
预处理可以是(简单的伪代码):
几个月前,我研究了CSV-1203文件格式标准,因此首先要意识到的是,您没有处理CSV文件,即使它的名称为“xyz.CSV”
正如这里的其他人所说,编写自己的阅读器会更容易,它们并不太难。我也讨厌一切正则表达式,但好消息是你可以编写任何解决方案,而不必使用它
有两件事:Excel对以两个大写字母ID(不带引号)开头的CSV文件做了一件非常奇怪的事情。它认为您的CSV是一个损坏的SYLK文件!试试看
有关此问题的详细信息和详细的CSV文件格式规范,请参阅您不能要求一个干净/有效的数据源吗?不要使用FileHelpers。只需自己编写一个简单的导入代码。它只有3列。通常解析前两列,然后将其余列作为最终描述列。我计划要求一个cleaned source然而,我不确定源系统能够提供什么,因此,为了以防万一,我试图找到一个替代方案。仅仅获取描述字段就花了足够长的时间。第二个问题是所有数据都是用户生成的,我不相信对用户有太多限制(遗憾的是)我的例子是用3列来说明这个问题,实际的数据要多得多。有更多的数据(包括列和行)在实际数据中,因此我不能依赖于替换特定项目。无论如何,修复源文件似乎是最简单的选择,否则正如Jon Hanna提到的,您将需要编写一系列特定的规则和条件来解析文件。
"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>"
var sb = new StringBuilder()
var regex = new Regex("\",\"");
foreach(string line in textFileLines)
{
sb.AppendLine(regex.Replace(line , "\"|\"", 2));
}