逐行阅读

时间:2009-09-30 06:34:49

标签: c# winforms line

我有一个生成纯文本文件的程序。结构(布局)始终相同。例:

<小时/>

文本文件:

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

4 个答案:

答案 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方法分为三种方法:ReadControlTypeReadTextReadLocation。每种方法都负责只读取它应该读取的项目,并将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终止,第二个字段由引号分隔,第三个字段以逗号终止...

我的第一个推荐是调整文件的格式,以便它很容易解析。您编写文件以便控制。例如,文本中没有新行,每个项目都在自己的行上。然后你就可以阅读四行,完成工作。