【问题标题】:Microsoft.VisualBasic.FileIO.TextFieldParser doesn't work with quotation marksMicrosoft.VisualBasic.FileIO.TextFieldParser 不适用于引号
【发布时间】:2014-08-13 04:07:46
【问题描述】:

我正在使用 TextFieldParser 解析 X509 证书的 Subject 和 Issuer 字段。例如,如果您查看https://facebook.com 上的证书,您会看到

CN=*.facebook.com,O="Facebook, Inc.",L=Menlo Park,S=CA,C=US

当然,如果不是因为那些讨厌的引号,用逗号分隔那一行会很简单。所以我必须逃避那些。这就是我想使用 TextFieldParser 的原因。我的代码:

string[] subjectPieces = null;

using (MemoryStream memStream = new MemoryStream(Encoding.ASCII.GetBytes(cert.Subject)))
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(memStream))
{                
    parser.SetDelimiters(",");
    parser.HasFieldsEnclosedInQuotes = true;
    subjectPieces = parser.ReadFields();
}

当这段代码运行时,subjectPieces 将返回:

CN=*.facebook.com
O="Facebook
Inc."
L=Menlo Park
S=CA
C=US

如您所见,它根本不考虑用引号括起来的字段。我还不如直接用string.split(',')

我尝试将HasFieldsEnclosedInQuotes 设置为true 和false,但没有效果。我已经为流尝试了多种字符编码,但没有效果。

【问题讨论】:

    标签: c# csv


    【解决方案1】:

    我不是 CSV 格式方面的专家,但我认为发生这种情况的原因是您的示例文本不是有效的 CSV 格式。正如here中提到的:

    必须引用嵌入逗号或双引号字符的字段。

    换句话说,要使您的示例成为正确的 CSV 文件,O="Facebook, Inc." 需要为 "O=Facebook, Inc.",即整个字段必须用双引号引起来。

    因此,要继续使用 TextFieldParser 类,您需要确保正确引用字段并引用嵌入的双引号字符。

    此外,您可能还想查看following question 的替代方案。

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2011-01-20
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多