【发布时间】:2016-01-06 02:09:53
【问题描述】:
我最近学习 TextFieldParser 来解析 words,而以前我会使用 string.Split 来解析。还有一个关于新学的class的问题。
如果我们使用 string.Split 和 StringSplitOptions.RemoveEmptyEntries 解析这样的消息
string message = "create myclass \"56, 'for better or worse'\""; //have multiple spaces
string[] words = message.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
然后我们会得到words,其中包含如下三个元素:
[0] create
[1] myclass
[2] "56, 'for better or worse'"
但是如果我们用TextFieldParser来做的话
string str = "create myclass \"56, 'for the better or worse'\"";
var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(new StringReader(str)); //treat string as I/O
parser.Delimiters = new string[] { " " };
parser.HasFieldsEnclosedInQuotes = true;
string[] words2 = parser.ReadFields();
那么return 将包含一些words 没有文字
[0] create
[1]
[2]
[3]
[4] myclass
[5]
[6]
[7] "56, 'for better or worse'"
现在有没有与 string.Split StringSplitOptions.RemoveEmptyEntries 一样删除结果数组中的空 words 的等效方法?
【问题讨论】:
-
这看起来不像 CSV。为什么要使用 much slower VB6 TextFieldParser 而不是 String.Split 或 Regex?
-
@Pierre-LucPineault 我不知道这是否通常用于(仅用于)CSV 文本,先生。但是在我之前的问题中,两位知名人士建议我使用它来解析我的文本,并且他们说性能更好。由于我是新手,我相信他们的判断并使用它。这是帖子:stackoverflow.com/questions/34607051/…如果你能提供其他观点,我会很高兴
-
@Pierre-LucPineault 我打开了您提供的链接并阅读了时差!怎么可能!看我给的链接。那里的意见完全不同。
-
String.Split 只是拆分字符串,而另一个有更多的逻辑来尊重 CSV 的规范。所以对于一个简单的工作 String.Split 会快得多。最初我虽然您只是在寻找替代方案,但是您的东西更像是一个奇怪的 CSV,但用 n 个空格分隔。除非您添加一些逻辑,否则 String.Split 将无法遵循所有 CSV 规范,但 Regex 可以很好地完成这项工作并正确处理空格数。您可以对两者进行基准测试,但我怀疑最终正则表达式会更易于使用且速度更快。
-
在这种情况下,更多是因为开销而不是严格地在 VB 程序集中。臃肿的 CSV 解析器库会产生相同的结果。我没有关于 C# vs VB 项目中的 VB 程序集的任何数据,所以我不能肯定地说。但我想两者都将转换为几乎相同的 MSIL,所以没关系。
TextFieldParser很慢,因为它是TextFieldParser。 DotNetPerls 也做了一些基准测试和agrees on that。
标签: c# parsing textfieldparser