定界字符串解析?

时间:2008-08-13 18:46:45

标签: c# text-parsing delimited-text

我正在寻找解析分隔字符串,大概是

A,B,C

但这是一个非常简单的例子,解析分隔数据会变得复杂;例如

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

会破坏你的naiive string.Split实现到位。有什么我可以自由使用/窃取/复制和粘贴,为解析分隔文本提供了相对防弹的解决方案吗? .NET,plox。

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

9 个答案:

答案 0 :(得分: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
    }
}

我相信这里有人可以将其转换为解析器内存中的字符串。

答案 1 :(得分:2)

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

  • 状态1:读取每个字符,直到你点击“或”,
    • 如果是“:移至州2
    • 如果是,:移至州3
    • 如果文件结束:转到状态4
  • 状态2:阅读每个字符,直到你点击“
    • 如果是“:移至州1
    • 如果文件结束:移动到状态4或由于未终止的字符串发出错误
  • 状态3:将当前缓冲区添加到输出数组,将光标向前移动,然后返回到状态1.
  • 状态4:这是最终状态,除了返回输出数组外什么都不做。

答案 2 :(得分:2)

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

答案 3 :(得分:2)

可在此处找到一个非常复杂的库:FileHelpers

答案 4 :(得分:1)

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

您可能希望将问题重新定义为更精确的问题(例如我可以使用什么代码段或库来解析.NET中的CSV数据?)。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

迟到总比没有好(加上SO的完整性):

http://www.codeproject.com/KB/database/CsvReader.aspx

这一条规则。

GJ

答案 7 :(得分:0)

我认为通用框架需要在两件事之间指定: 1.什么是划界字符。 2.在什么条件下这些字符不计算(例如它们在引号之间)。

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

答案 8 :(得分:0)

最简单的方法就是将字符串拆分为char数组并查找字符串确定符和split char。

单元测试应该相对容易。

您可以将其包装在类似于基本.Spilt方法的扩展方法中。