【问题标题】:StringSplitOptions.RemoveEmptyEntries equivalent for TextFieldParserStringSplitOptions.RemoveEmptyEntries 等效于 TextFieldParser
【发布时间】:2016-01-06 02:09:53
【问题描述】:

我最近学习 TextFieldParser 来解析 words,而以前我会使用 string.Split 来解析。还有一个关于新学的class的问题。

如果我们使用 string.SplitStringSplitOptions.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


【解决方案1】:

也许这样就可以了

parser.HasFieldsEnclosedInQuotes = true;
string[] words2 = parser.ReadFields();
words2 = words2.Where(x => !string.IsNullOrEmpty(x)).ToArray();

一个班轮替代可能是

string[] words2 = parser.ReadFields().Where(x => !string.IsNullOrEmpty(x)).ToArray();

【讨论】:

  • 感谢您的及时回复,先生。但这似乎不起作用。我知道我可以使用LINQ
  • 我会删除修剪并使用 !string.IsNullOrWhiteSpace(tag)
  • 请删除第一个实现,它实际上不起作用。此外,您可以在一行中完成所有操作:string[] words2 = parser.ReadFields().Where(x => !string.IsNullOrEmpty(x)).ToArray();
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2019-06-29
  • 2021-09-22
相关资源
最近更新 更多