Microsoft.VisualBasic.FileIO.TextFieldParser不适用于引号

时间:2014-08-13 04:07:46

标签: c# csv

我正在使用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,但没有效果。我为流做了多个字符编码,没有效果。

1 个答案:

答案 0 :(得分:2)

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

  

必须引用包含逗号或双引号字符的字段。

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

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

此外,您可能需要查看following question替代方案。