阅读文本段落,使用StreamReader获取下一行

时间:2012-03-22 19:19:35

标签: c# treeview streamreader

我正在尝试阅读一个文本文档,该文档基本上分为信息的“段落”,所有信息都具有相同格式的标题。

目标是将每个标题标题作为父标题添加到treeView,将其余标题信息添加为treeView的子标题。

添加标题很容易,但是我在将子项添加到正确的父项时遇到了问题。我正在使用StreamReader读取每一行,找到“段落”的开头并创建父级。我需要添加的孩子将在接下来的三行中出现。如何从StreamReader's ReadLine()获取当前线?或者有更好的方法吗?

using (var sr = new StreamReader(file))
{
     string line;
     while ((line = sr.ReadLine()) != null)
     {
         //Sheet name
         if (line.Contains("Sheet Name"))
         {
             string parentNodeName = line.Split('=')[1].Trim();

              //Add Parent
              treeView.Nodes.Add(parentNodeName);
              //Add children, on next 3 lines
              treeView.Nodes[parentNodeName].Nodes.Add("Child-1 Text"); //on next line
              treeView.Nodes[parentNodeName].Nodes.Add("Child-2 Text"); //on next next line
              treeView.Nodes[parentNodeName].Nodes.Add("Child-3 Text"); //etc
              }
          }
      sr.Close();
      sr.Dispose();
 }

文件中的示例文本(“段落”标题):

800: Sheet Name = Sheet3
999  : Process  = 2
1000 : Material = AL,CR,STEEL
1001 : Cut Quality = 0,1,2,3,4,5,6,7,8

我将解析这些行以添加到树中,将子节点添加到相同的父节点。像:

Sheet3
    2
        AL,CR,STEEL
              0,1,2,3,4,5,6,7,8 
        SS
              0,1,2,3,4,5,6,7,8 
        MS
              0,1,2,3,4,5 
    4
        AL,CR,STEEL
              0,1,2,3,4,5,6,7,8 
        MS
              0,1,2,3,4,5
    10
        AL,CR,STEEL
              0,1,2,3,4,5,6,7,8
        SS
              0,1,2,3,4,5,6,7,8   

1 个答案:

答案 0 :(得分:4)

以下是如何读取文件和构建TreeView的示例。

using (var reader = new StreamReader(file))
{
    while (!reader.EndOfStream)
        AddParagraphToTree(ReadParagraph(reader));
}     

坦率地说,最好将这两个操作分开 - 解析文件和构建树。但是快速的样品会去。还要考虑在使用块结束时自动调用Dispose()。

private class Paragraph
{
    public string SheetName { get; set; }
    public string Process { get; set; }
    public string Material { get; set; }
    public string CutQuality { get; set; }
}

这里我们解析文件。我想文件完全符合预期的格式。没有错误处理,没有格式检查。你可以自由添加一些:)

private Paragraph ReadParagraph(StreamReader reader)
{
    Paragraph paragraph = new Paragraph();
    paragraph.SheetName = ReadNextValue(reader);
    paragraph.Process = ReadNextValue(reader);
    paragraph.Material = ReadNextValue(reader);
    paragraph.CutQuality = ReadNextValue(reader);
    return paragraph;
}

private string ReadNextValue(StreamReader reader)
{
    return reader.ReadLine().Split('=')[1].Trim();
}

在这里,我们将已解析的段落添加到树中。

private void AddParagraphToTree(Paragraph paragraph)
{
    var sheetNode = AddNode(treeView.Nodes, paragraph.SheetName);
    var processNode = AddNode(sheetNode.Nodes, paragraph.Process);
    var materialNode = AddNode(processNode.Nodes, paragraph.Material);
    AddNode(materialNode.Nodes, paragraph.CutQuality);
}

private TreeNode AddNode(TreeNodeCollection nodes, string key)
{
    if (!nodes.ContainsKey(key))
        nodes.Add(new TreeNode(key) { Name = key });

    return nodes[key];
}