题
我正在考虑解析一个分隔字符串,大约是
甲、乙、丙
但这是一个非常简单的示例,解析分隔数据可能会变得复杂;例如
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 的控制文件模型(这就是它背后的灵感)。
我认为通用框架需要在两件事之间指定:1.分隔符是什么。2.在什么情况下这些字符不计算在内(例如当它们位于引号之间时)。
我认为每次需要做这样的事情时编写自定义逻辑可能会更好。
最简单的方法是将字符串拆分为字符数组,然后查找字符串限定符并拆分字符。
单元测试应该相对容易。
您可以将其包装在类似于基本 .Spilt 方法的扩展方法中。
不隶属于 StackOverflow