Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# TextFieldParser在(似乎)格式良好的CSV行上抛出格式错误的LineException(错误文本似乎不适用)_C#_Vb.net_Csv - Fatal编程技术网

C# TextFieldParser在(似乎)格式良好的CSV行上抛出格式错误的LineException(错误文本似乎不适用)

C# TextFieldParser在(似乎)格式良好的CSV行上抛出格式错误的LineException(错误文本似乎不适用),c#,vb.net,csv,C#,Vb.net,Csv,我有一些非常典型的代码,可以使用Microsoft.VisualBasic.FileIO.TextFieldParser来解析CSV文件: using (TextFieldParser parser = new TextFieldParser(new StringReader(jobsReport))) { parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; string[] heade

我有一些非常典型的代码,可以使用Microsoft.VisualBasic.FileIO.TextFieldParser来解析CSV文件:

using (TextFieldParser parser = new TextFieldParser(new StringReader(jobsReport)))
{
    parser.SetDelimiters(",");
    parser.HasFieldsEnclosedInQuotes = true;

    string[] headers = parser.ReadFields();

    while (!parser.EndOfData)
    {
        // ERROR OCCURS HERE
        string[] fields = parser.ReadFields();
        // ...
    }
}
但是,我得到以下例外情况:

Microsoft.VisualBasic.FileIO.MalformedLineException: Line 195 cannot be parsed using the current Delimiters.
第195行(根据Notepad++)如下所示:

0,0,0,0,0,0,0,2017-01-03T00:00:00,,"72d7a7e9-8700-4014-916c-a85e9a6b1ac5",1,REF212U,CREATED,"Evan job for ""Publish Bug""",Changzhou,China,31.77359,119.95401,Jiangsu
如果我手动删除双引号,并将行设置为:

0,0,0,0,0,0,0,2017-01-03T00:00:00,,"72d7a7e9-8700-4014-916c-a85e9a6b1ac5",1,REF212U,CREATED,"Evan job for Publish Bug",Changzhou,China,31.77359,119.95401,Jiangsu
它工作得很好。根据,这是避免双引号的正确方法

此外,Excel对该文件的处理也很好:

这正是我所期望的处理方式

Microsoft有一个错误描述如下:“无法分析指定的行,因为它使用的分隔符不是指定的分隔符。”然后,它毫无帮助地建议我更改以下内容以修复该错误:“调整分隔符以便正确分析该行,或插入异常处理代码以处理该行。”

不过,我不明白这是怎么回事——在这种情况下,这似乎不是问题所在

那么,我的问题是:为什么解析器在这一行崩溃,即使转义看起来是正确的?为什么会出现这种特殊的错误消息?当然,最重要的是:我如何解决这个问题

编辑:下面是一些周围的线条:

"RBCD","0","0","0","1","0","4","0","2017-01-02T00:00:00","","f233e70a-293d-4953-b96d-79eb29261ea7","1","REF211I","OFFER","Planning Engineer","Wuxi","China"
"AFCO","0","0","0","0","0","0","0","2017-01-03T00:00:00","","15b6eda6-ce71-426d-8530-49c9044b3d62","0","REF214Q","CREATED","Technical Consultant","Shanghai","China"
"RBUS","0","0","0","0","0","0","0","2017-01-03T00:00:00","","a8f3930f-897c-4e4d-8b52-9029efdb9c65","0","REF215E","CREATED","Sr. Calibration Engineer","Farmington Hills","United States"
"PTCN","0","0","0","0","0","0","0","2017-01-03T00:00:00","","72d7a7e9-8700-4014-916c-a85e9a6b1ac5","1","REF212U","CREATED","Evan job for ""Publish Bug""","Changzhou","China"
"RBAC","0","0","0","0","0","0","0","2017-01-03T00:00:00","","fd643834-bafd-4674-aad9-4fe5cb0271cd","0","REF213F","CREATED","Test_Technical Consultant","Suzhou","China"
"RBCN","0","0","0","0","0","1","0","2017-01-04T00:00:00","","0c450e80-f64e-429d-9d85-3fd09a806d1f","1","REF218R","SOURCING","Test Job Role approver","Shanghai","China"
"","0","0","0","1","0","3","0","2017-01-04T00:00:00","","c952f49c-db78-4a86-8ad5-797e1b7f6933","1","REF217C","OFFER","quality engineer-SQE","Shanghai","China"

恐怕TextFileParser可以处理这种情况。使用oledb连接并使用datareader读取可能会更幸运。或者使用其他开源CSV解析器

我可以推荐的是

输出:

{
  "Column1": 0,
  "Column2": 0,
  "Column3": 0,
  "Column4": 0,
  "Column5": 0,
  "Column6": 0,
  "Column7": 0,
  "Column8": "2017-01-03T00:00:00",
  "Column9": null,
  "Column10": "72d7a7e9-8700-4014-916c-a85e9a6b1ac5",
  "Column11": 1,
  "Column12": "REF212U",
  "Column13": "CREATED",
  "Column14": "Evan job for \"Publish Bug\"", <-- Correct value
  "Column15": "Changzhou",
  "Column16": "China",
  "Column17": 31.77359,
  "Column18": 119.95401,
  "Column19": "Jiangsu"
}
{
“Column1”:0,
“第2列”:0,
“Column3”:0,
“Column4”:0,
“第5列”:0,
“第6列”:0,
“第7列”:0,
“第八栏”:“2017-01-03T00:00:00”,
“Column9”:空,
“第10栏”:“72d7a7e9-8700-4014-916c-a85e9a6b1ac5”,
“第11栏”:1,
“第12栏”:“参考212U”,
“第13列”:“已创建”,

“第14栏”:“发布错误”的Evan作业,您是否尝试过设置类型
parser.TextFieldType=Microsoft.VisualBasic.FileIO.FieldType.Delimited
?@RacilHilan是的,不幸的是它似乎没有帮助。
TextFieldParser
的源代码不是公开的,但它的Mono对应物是公开的,如果我们假设它是Microsoft库的忠实克隆,impleme引用案例中的转义引号说明:在引用标记中,它只是将任何双引号解释为引用的结尾。如果我没有误解源代码,这显然是一个缺点,如果不是错误的话。我不能用给定的样本行重现错误。如果不能检查周围的文本,就不可能提供太多帮助。T正如错误所示,源文本的格式可能不正确,但您需要对此进行调查。@TnTinMn如果有帮助的话,我编辑了一些周围行的示例。我找不到这些行的任何内容,但可能遗漏了一些内容。我想您可能会说,我在这里发布问题的事实意味着我错过了som不过,ething:)
{
  "Column1": 0,
  "Column2": 0,
  "Column3": 0,
  "Column4": 0,
  "Column5": 0,
  "Column6": 0,
  "Column7": 0,
  "Column8": "2017-01-03T00:00:00",
  "Column9": null,
  "Column10": "72d7a7e9-8700-4014-916c-a85e9a6b1ac5",
  "Column11": 1,
  "Column12": "REF212U",
  "Column13": "CREATED",
  "Column14": "Evan job for \"Publish Bug\"", <-- Correct value
  "Column15": "Changzhou",
  "Column16": "China",
  "Column17": 31.77359,
  "Column18": 119.95401,
  "Column19": "Jiangsu"
}