Microsoft.VisualBasic.FileIO.TextFieldParser不能使用引号

本文关键字:不能 VisualBasic FileIO TextFieldParser Microsoft | 更新日期: 2023-09-27 18:17:40

我使用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,没有效果。我已经为流尝试了多种字符编码,没有效果。

Microsoft.VisualBasic.FileIO.TextFieldParser不能使用引号

我不是CSV格式的专家,但我认为发生这种情况的原因是您的示例文本不是有效的CSV格式。如前所述:

带有内嵌逗号或双引号的字段必须加引号。

换句话说,对于您的示例是一个适当的CSV文件,O="Facebook, Inc."需要是"O=Facebook, Inc.",即整个字段必须双引号。

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

另外,您可能需要查看以下问题以寻找替代方案。