Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据处理难题/头痛_C#_Csv - Fatal编程技术网

C# 数据处理难题/头痛

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

我有一个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"

我考虑过(尽管我讨厌这种任务的正则表达式)用
替换所有
,然后使用
(?你必须重新发明轮子,因为那不是有效的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));
    }