分隔字符串解析?

时间:2020-03-05 18:39:27  来源:igfitidea点击:

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

a,b,c

但这是一个非常简单的示例,解析定界数据可能会变得很复杂。例如

1,"简单算法,它会失败",正确

会破坏幼稚字符串。将实现拆分为位。有什么我可以自由使用/窃取/复制和粘贴的内容,可以为解析定界文本提供相对安全的解决方案吗? .NET,plox。

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

解决方案

回答

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

我认为,每次需要执行此类操作时,最好编写自定义逻辑。

回答

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

  • 如果是,:移至状态3
  • 如果文件结尾:移至状态4
  • 如果文件结尾:由于字符串未终止,请移至状态4或者发出错误信号
  • 状态3:将当前缓冲区添加到输出数组,将光标向前移动到后面,然后返回到状态1.
  • 状态4:这是最终状态,除了返回输出数组外,不执行任何操作。

回答

这里有一些很好的答案:拆分一个字符串,忽略带引号的部分

我们可能想将问题改写为更精确的内容(例如,我可以使用哪些代码段或者库来解析.NET中的CSV数据?)。

回答

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

回答

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

单元测试应该相对容易。

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

回答

我用它来读取文件

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

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

回答

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

回答

可以在这里找到一个非常综合的库:FileHelpers