我正在考虑解析一个分隔字符串,大约是

甲、乙、丙

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

1、“你的简单算法,它失败了”,正确

会让你天真的 string.Split 实现变成碎片。有什么我可以自由使用/窃取/复制和粘贴的东西,可以为解析分隔文本提供相对可靠的解决方案吗?.NET,plox。

更新: 我决定和 文本字段解析器, ,它是隐藏在 Microsoft.VisualBasic.DLL 中的 VB.NET 一堆好东西的一部分。

有帮助吗?

解决方案

我用它来读取文件

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:读取每个字符,直到您点击 " 或 a ,
    • 如果出现“:转移到状态 2
    • 如果是 ,:转移到状态 3
    • 如果是文件结尾:转移到状态4
  • 状态2:读取每个字符,直到遇到“
    • 如果出现“:移至状态 1
    • 如果是文件末尾:移动到状态 4 或由于未终止的字符串而发出错误信号
  • 状态3:将当前缓冲区添加到输出数组中,将光标向前移动到 后面,然后返回到状态 1。
  • 状态4:这是最终状态,除了返回输出数组之外不执行任何操作。

例如

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;
}

这里有一些很好的答案: 分割字符串忽略引用的部分

您可能想将您的问题改写为更精确的内容(例如 我可以使用什么代码片段或库来解析 .NET 中的 CSV 数据?).

为了做一个无耻的插件,我已经在一个名为的库上工作了一段时间 福特洛 (格式化文本加载器)我用来根据分隔符、位置或正则表达式快速解析大量文本。对于快速字符串来说,这有点过分了,但如果您正在处理日志或大量日志,那么它可能正是您所需要的。它采用类似于 SQL*Loader 的控制文件模型(这就是它背后的灵感)。

迟到总比不到好(增加 SO 的完整性):

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

这就是规则。

国杰

我认为通用框架需要在两件事之间指定:1.分隔符是什么。2.在什么情况下这些字符不计算在内(例如当它们位于引号之间时)。

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

最简单的方法是将字符串拆分为字符数组,然后查找字符串限定符并拆分字符。

单元测试应该相对容易。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top