TextFileParser 和文本中间的双引号

TextFileParser and double-quotes in the middle of text

提问人:Andrew 提问时间:11/8/2023 更新时间:11/8/2023 访问量:60

问:

我有一个正在导入的 csv 文件,每隔一段时间,产品描述就会在中间包含一些引号,导致 TextFileParser 停止。它失败的行是这样的:

42000168,1004,10035,423,“1000 LB 3/8” DCD ORG“, ”HALB WIP“,0

您可以看到产品代码在开头和结尾报价的中间有 3/8 英寸。但是 - 此 CSV 来自他们不打算调整产品名称的 SAP 系统。

我的代码:

Dim parser as TextFieldParser = new TextFieldParser(csvFile)
parser.TextFeldType = FieldType.Delimited
parser.Delimiters = new String() {","}
parser.HasFieldsEnclosedInQuotes = True

While Not parser.EndOfData
    Dim fields as string() = parser.ReadFields()
    Dim row as DataRow = rawTable.NewRow()
    row("MTL") = fields(0)
    row("PL") = fields(1)
    row("MG") = fields(2)
    row("MRP") = fields(3)
    row("MTLDESC") = fields(4)
    row("GPDESC") = fields(5)      
    row("NET") = fields(6) 

    rawTable.Rows.Add(row)
End While

我怎样才能使这种类型的产品描述在使用解析器时起作用?

vb.net CSV

评论

0赞 Joel Coehoorn 11/8/2023
这显然是无效的 csv 数据。我希望在最初创建 csv 的另一端修复它(因为它确实是_broken)。请注意,我不建议更改任何产品名称。我建议修复损坏的导出代码,以便正确转义该值。
0赞 Andrew 11/8/2023
那是不可能的。这些是 SAP 中的旧产品名称。顺便说一句,这个文件曾经用 SQL SSIS 解析没有问题。我知道它是无效的,但我必须找出某种解决方法。
2赞 Joel Coehoorn 11/8/2023
再说一遍:不建议更改名称。但是,导出这些名称的进程应该检测并转义双引号字符,如果不这样做,则导出会损坏。您的其他选择是自己预处理损坏的数据(这可能会很痛苦)或使用不同的 csv 解析器。NuGet 上有几个;也许一个人更宽容。
1赞 MyICQ 11/8/2023
如果您不需要导入大小写,则可以“转义”大小写和类似内容,方法是最初将前面没有逗号的每个引号替换为不同的字符,然后导入行,然后反转。示例:with etc。或者,找到与引号不同的分隔符,例如竖线、制表符或 .有很多方法,但从不保证不会在利基案例中打破。this,"abc",is quoted3/8"123,"Size 3/8" bolt", 999123,"Size 3/8§ bolt", 999¤
1赞 Jimi 11/8/2023
您可以尝试使用 CsvHelper。在其配置中,可以指定一个 Mode 属性,该属性定义字段中引号的处理方式

答: 暂无答案