читать данные из текстового файла и сохранять их в коллекции - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь прочитать текст, разделенный вкладкой '\ t', и сохранить его в списке объектов.текст выглядит так:

1   Name    Number      City

Я пробовал этот метод, но он работает только для одной строки:

string line = sr.ReadLine();
string[] word = line.Split('\t');

for (int i = 0; i <= word.Length; i++)

ec.code = Convert.ToInt32(word[0]);
ec.Name = word[1];
ec.Number = Convert.ToInt32(word[2]);
ec.City = word[3];
list.Add(ec);

Как я могу прочитать все строки в списке?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Проблема в том, что вы обрабатываете только одну строку, когда делаете sr.ReadLine().Вместо этого вы можете рассмотреть возможность использования File.ReadAllLines, который считывает все строки в массив.Вы можете комбинировать это с методом Split, чтобы извлечь нужные элементы из каждой строки.

Ваш цикл for также не имеет смысла - кажется, что вы циклически повторяете каждое слово в строке, нов теле цикла вы добавляете все слова каждый раз.Я думаю, что цикл for можно удалить.

Кроме того, неясно, что такое ec, но вам, вероятно, следует создавать новый экземпляр на каждой итерации.В противном случае вы просто добавляете одну и ту же ссылку в ваш список снова и снова, и все они будут иметь одинаковые значения (из последней прочитанной строки).

Вот пример класса, который я использую:

// Class to represent whatever it is you're adding in your loop
class EC
{
    public int Code { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }
    public string City { get; set; }
}

Одна вещь, которую мы должны сделать, прежде чем ссылаться на индексы в массиве, возвращаемом при вызове Split, мы должны убедиться, что сначала достаточно элементов.В противном случае мы получим исключение IndexOutOfRange, если попытаемся сослаться на индекс, который не существует.

Кроме того, неплохо бы убедиться, что строки, которые мы ожидаем получить как целые числа, на самом деле целых чисел.Мы можем сделать это с помощью int.TryParse, который вернет true в случае успеха и установит аргумент out в проанализированное значение.

Вот пример, который использует все эти идеи:

// Path to our file
var filePath = @"f:\public\temp\temp.txt";

// The list of things we want to create from the file
var list = new List<EC>();

// Read the file and create a new EC for each line
foreach (var line in File.ReadAllLines(filePath))
{
    string[] words = line.Split('\t');

    // First make sure we have enough words to create an EC
    if (words.Length > 3)
    {
        // These will hold the integers parsed from our words (if parsing succeeds)
        int code, number;

        // Use TryParse for any values we expect to be integers
        if (int.TryParse(words[0], out code) && int.TryParse(words[3], out number))
        {
            list.Add(new EC
            {
                Code = code,
                Name = words[1],
                Number = number,
                City = words[3]
            });
        }
    }
}
0 голосов
/ 08 июня 2018

Предполагая, что каждая строка в файле соответствует вашему формату 1 Name Number City, вы можете попробовать это:

var lines = File.ReadAllLines(filename);
foreach (var line in lines)
{
     string[] word = line.Split('\t');
     for (int i = 0; i <= word.Length; i++)
     {    
          ec.code = Convert.ToInt32(word[0]);
          ec.Name = word[1];
          ec.Number = Convert.ToInt32(word[2]);
          ec.City = word[3];
          list.Add(ec);
     }
}
...