我正在分析一个分隔的字符串,大约为
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.在什么情况下这些字符不计数(例如,当它们在引号之间时)。
我认为,每次需要执行此类操作时,最好编写自定义逻辑。