2008-08-13 137 views
3

我看的分隔字符串解析?

A,B的顺序解析分隔的字符串,东西,C

但是,这是一个很简单的例子,和解析分隔的数据可能会很复杂;例如

1, “你简单的算法,它失败”,真

会打击你的naiive string.Split实施位。有什么我可以自由使用/窃取/复制和粘贴,为解析分隔文本提供了一个相对简单的解决方案? .NET,plox。

更新:我决定去与TextFieldParser,这是VB.NET的一堆隐藏在Microsoft.VisualBasic.DLL的好东西的一部分。

回答

4

我用这从一个文件

string filename = @textBox1.Text; 
string[] fields; 
string[] delimiter = new string[] {"|"}; 
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser = 
     new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) { 
    parser.Delimiters = delimiter; 
    parser.HasFieldsEnclosedInQuotes = false; 

    while (!parser.EndOfData) { 
     fields = parser.ReadFields(); 
     //Do what you need 
    } 
} 

阅读我相信有人在这里可以改变这解析器字符串,它是在内存中。

0

我在考虑一个通用框架需要指定两件事情: 1.什么是分隔字符。 2.在什么情况下,这些字符不会被计数(例如当它们在引号之间时)。

我觉得在每次你需要做这样的事情时,编写自定义逻辑可能会更好。

2

我不知道任何框架的,但一个简单的状态机工作原理:

  • 状态1:读每一个字符,直到你打一个“或,
    • 在情况下”:移动到状态2
    • 在的情况下,:移动到状态3
    • 在文件的末尾的情况下:移动到状态4
  • 状态2:读每一个字符,直到你打一个“
    • 在的情况下”:移动到状态1
    • 在文件末尾的情况:要么移到国家4或信号,因为一个错误一个未终止的字符串
  • 状态3:当前缓冲区添加到输出数组,向前移动光标后面,并返回到状态1
  • 状态4:这是最终状态,什么也不做,除了返回输出数组。
+0

CSV字符串可以包括文本引号内换行字符,所以你不能发出错误信号而在状态2,如果行的末尾。 – cjk 2009-02-26 14:24:03

+0

实际上,我总是忘记可怕的\ n字符,它将大多数CSV解析器搞砸了。澄清。 – 2009-02-26 15:38:34

1

这里有一些很好的答案:Split a string ignoring quoted sections

你可能想你的问题重新措辞的东西更精确(?如我可以使用代码片段或库在.NET解析CSV数据) 。

2

​​
+1

@ C1pher请不要进行风格编辑,如Java与C#/ Pascal包围。 – StuartLC 2014-01-10 16:37:36

+0

同意。我试图拒绝这个编辑,但它已被批准。 – 2014-01-10 16:44:13

+0

我想补充一点,我们不是K&R,也不是Linux内核开发。 FFS,伙计们。 – Stu 2014-01-10 20:11:00

0

简单的方法是将字符串分割成一个字符数组,寻找您的字符串限定词和分裂焦炭。

它应该是相对容易的单元测试。

您可以用类似于基本.Spilt方法的扩展方法来包装它。

1

为了做一个无耻的插件,我一直在研究一个名为fotelo(格式化文本加载器)的库,我用它来快速解析大量基于分隔符,位置或正则表达式的文本。对于一个快速的字符串来说它是过度杀毒,但如果你使用的是日志或大量的数据,它可能正是你所需要的。它使用类似于SQL * Loader的控制文件模型(其背后的灵感来源)。