会让您幼稚的字符串发狂,将实现拆分为位。有什么我可以自由使用/窃取/复制和粘贴的内容,可以为解析分隔的文本提供相对安全的解决方案吗? .NET,plox。
更新:我决"/>

关于c#:定界字符串解析?

关于c#:定界字符串解析?

Delimited string parsing?

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

a,b,c

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

1,"您的简单算法失败了",真的

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

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


我用它来读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
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
    }
}

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


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


例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}

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

  • 状态1:阅读每个字符,直到您打出"或a为止

    • 如果是":移至状态2
    • 如果是,:移至状态3
    • 如果文件结尾:移至状态4
  • 状态2:阅读每个字符,直到您打出\\

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

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

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

此规则。

GJ


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


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

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


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

应该相对容易进行单元测试。

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


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

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


推荐阅读