читать абзацы текста, получать следующие строки с помощью StreamReader - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь прочитать текстовый документ, который разделен на «абзацы» информации, которые имеют одинаково отформатированные заголовки.

Цель состоит в том, чтобы добавить каждый заголовок заголовка как родительский элемент к 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 Ответ

4 голосов
/ 23 марта 2012

Вот пример, как вы можете прочитать файл и построить 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...