Мой StreamReader читает только вторую и четвертую строки из моего 4-строчного текстового файла - PullRequest
1 голос
/ 18 октября 2019

У меня есть программа, которая читает данные из файла и создает узлы для графика, используя эти данные. Проблема в том, что из файла из 4 строк моя программа создает только два узла (одна строка должна создавать один узел). Текстовый файл выглядит следующим образом:

A/0/0.7
C/1/0/0.1 0.4
B/1/0/0.6 0.8
D/2/2 1/0.6 0.7 0.1 0.2

Структура данных узла (это байесовская сеть):

Имя узла / Количество родителей / Родительские индексы в файле / Вероятности

using (StreamReader reader = new StreamReader(file))
            {
                while ((line = reader.ReadLine()) != null)
                {
                    line = reader.ReadLine();
                    string name = "";
                    List<int> parents = new List<int>();
                    List<float> probs = new List<float>();
                    string[] splitLine = line.Split('/');
                    Console.WriteLine("splitLine array: ");
                    foreach (string item in splitLine)
                    {
                        Console.WriteLine(item);
                    }
                    Console.WriteLine();
                    int index = 2;

                    name = splitLine[0];

                    if (splitLine.Length == 4)
                    {
                        string[] temp = splitLine[2].Split(' ');
                        foreach (string item in temp)
                            parents.Add(Int32.Parse(item));
                        index = 3;
                    }

                    string[] temp1 = splitLine[index].Split(' ');
                    foreach (string item in temp1)
                        probs.Add(float.Parse(item, CultureInfo.InvariantCulture.NumberFormat));

                    Node newNode = new Node(name, parents, probs);
                    graph.Add(newNode);
                }
            }

Если вызывается конструктор Node, программа печатает, какие данные есть у нового узла. Я ожидаю, что это напечатает:

Created Node:
   Name: A
   Parents' indexes: 0
   Probabilities: 0.7
Created Node:
   Name: C
   Parents' indexes: 0
   Probabilities: 0.1 0.4
Created Node:
   Name: B
   Parents' indexes: 0
   Probabilities: 0.6 0.8
Created Node:
   Name: D
   Parents' indexes: 2 1
   Probabilities: 0.6 0.7 0.1 0.2

Но я получаю:

Created Node:
   Name: C
   Parents' indexes: 0
   Probabilities: 0.1 0.4
Created Node:
   Name: D
   Parents' indexes: 2 1
   Probabilities: 0.6 0.7 0.1 0.2

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Вы звоните reader.ReadLine() дважды:

while ((line = reader.ReadLine()) != null) // <-- First here
{
    line = reader.ReadLine(); // <-- Again here

Просто удалите второй line = reader.ReadLine(), поэтому ваш код:

...
while ((line = reader.ReadLine()) != null)
{
    string name = "";
    List<int> parents = new List<int>();
...
2 голосов
/ 18 октября 2019

Вы прочитали строку дважды.

using (StreamReader reader = new StreamReader(file))
{
    while ((line = reader.ReadLine()) != null) // HERE
    {
        line = reader.ReadLine(); // AND HERE
        string name = "";
        List<int> parents = new List<int>();
        List<float> probs = new List<float>();
        string[] splitLine = line.Split('/');
        Console.WriteLine("splitLine array: ");
        foreach (string item in splitLine)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine();
        int index = 2;

        name = splitLine[0];

        if (splitLine.Length == 4)
        {
            string[] temp = splitLine[2].Split(' ');
            foreach (string item in temp)
            parents.Add(Int32.Parse(item));
            index = 3;
        }

        string[] temp1 = splitLine[index].Split(' ');
        foreach (string item in temp1)
            probs.Add(float.Parse(item, CultureInfo.InvariantCulture.NumberFormat));

            Node newNode = new Node(name, parents, probs);
            graph.Add(newNode);
    }
}

Если убрать второе чтение, оно должно работать.

0 голосов
/ 18 октября 2019

В то время как другие указали, где ваша ошибка, я предлагаю новый подход.

Код

using System.Linq;
(...)

const string input = @"A/0/0.7
C/1/0/0.1 0.4
B/1/0/0.6 0.8
D/2/2 1/0.6 0.7 0.1 0.2"; 


static void Main(string[] args)
{
  // Write to file to imitate the scenario
  System.IO.File.WriteAllText("x.txt", input);

  var lines = System.IO.File.ReadAllLines("x.txt");

  var parsed = lines.Select( l => {
    var components = l.Split("/");

    var hasExtra = components.Length > 3;
    return new { 
      Name = components[0],
      // Omit StringSplitOptions.RemoveEmptyEntries for brevity
      Parents = components[hasExtra ? 2 : 1].Split(" ").Select(s => int.Parse(s)).ToArray(),
      Probabilities = components[hasExtra ? 3 : 2].Split(" ").Select(s => decimal.Parse(s)).ToArray() 
    };
    }).ToList(); // Execute the 'Select'

  var json = System.Text.Json.JsonSerializer.Serialize(
      value: parsed, 
      options: new System.Text.Json.JsonSerializerOptions() { WriteIndented = true });

  Console.WriteLine(json);
}

Вывод

[
  {
    "Name": "A",
    "Parents": [
      0
    ],
    "Probabilities": [
      0.7
    ]
  },
  {
    "Name": "C",
    "Parents": [
      0
    ],
    "Probabilities": [
      0.1,
      0.4
    ]
  },
  {
    "Name": "B",
    "Parents": [
      0
    ],
    "Probabilities": [
      0.6,
      0.8
    ]
  },
  {
    "Name": "D",
    "Parents": [
      2,
      1
    ],
    "Probabilities": [
      0.6,
      0.7,
      0.1,
      0.2
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...