我有一个生成纯文本文件的程序。结构(布局)始终相同。例:
<小时/>
LinkLabel
"Hello, this text will appear in a LinkLabel once it has been
added to the form. This text may not always cover more than one line. But will always be surrounded by quotation marks."
240, 780
因此,要解释该文件中发生的事情:
Control
Text
Location
<小时/> 当单击表单上的按钮,并且用户从OpenFileDialog对话框中打开其中一个文件时,我需要能够读取每一行。从顶部开始,我想查看它是什么控件,然后从第二行开始我需要能够在引号内获取所有文本(无论是否是一行文本或更多),并且在下一行(在收尾引号后),我需要提取位置(240,780)......我想到了几种方法,但是当我把它写下来并付诸实践时,它没有多大意义,最终找出不起作用的方式。
有没有人曾经这样做过?是否有人能够就我如何做到这一点提供任何帮助,建议或建议?
我查找了CSV文件,但这似乎太复杂了,看起来很简单。
由于 jase
答案 0 :(得分:2)
我会尝试写下算法,我解决这些问题的方式(在评论中):
// while not at end of file
// read control
// read line of text
// while last char in line is not "
// read line of text
// read location
尝试编写执行每条评论所说内容的代码,您应该能够弄明白。
HTH。
答案 1 :(得分:2)
您可以使用正则表达式从文本中获取行:
MatchCollection lines = Regex.Matches(File.ReadAllText(fileName), @"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)\r\n");
foreach (Match match in lines) {
string control = match.Groups[1].Value;
string text = match.Groups[2].Value;
int x = Int32.Parse(match.Groups[3].Value);
int y = Int32.Parse(match.Groups[4].Value);
Console.WriteLine("{0}, \"{1}\", {2}, {3}", control, text, x, y);
}
答案 2 :(得分:2)
您正在尝试实施解析器,最佳策略是将问题分成更小的部分。你需要一个TextReader
类来让你读取行。
您应该将ReadControl
方法分为三种方法:ReadControlType
,ReadText
,ReadLocation
。每种方法都负责只读取它应该读取的项目,并将TextReader
保留在下一个方法可以拾取的位置。这样的事情。
public Control ReadControl(TextReader reader)
{
string controlType = ReadControlType(reader);
string text = ReadText(reader);
Point location = ReadLocation(reader);
... return the control ...
}
当然,ReadText是最有趣的,因为它跨越多行。事实上,它是一个调用TextReader.ReadLine
的循环,直到该行以引号结束:
private string ReadText(TextReader reader)
{
string text;
string line = reader.ReadLine();
text = line.Substring(1); // Strip first quotation mark.
while (!text.EndsWith("\"")) {
line = reader.ReadLine();
text += line;
}
return text.Substring(0, text.Length - 1); // Strip last quotation mark.
}
答案 3 :(得分:1)
这种东西很烦人,它在概念上很简单,但你最终可能会遇到粗糙的代码。你有一个相对简单的案例:每个文件一个记录,如果你有很多记录就会变得更难,你想要很好地处理格式错误的记录(考虑为C#等语言编写解析器。
对于大规模问题,可以使用语法驱动的解析器,例如:link text
您的大部分复杂性来自文件缺乏规律性。第一个字段由nwline终止,第二个字段由引号分隔,第三个字段以逗号终止...
我的第一个推荐是调整文件的格式,以便它很容易解析。您编写文件以便控制。例如,文本中没有新行,每个项目都在自己的行上。然后你就可以阅读四行,完成工作。