分隔字符串解析?
时间: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