Как пропустить первую строку и начать чтение файла со второй строки в C # - PullRequest
3 голосов
/ 11 апреля 2011

Как начать чтение файла со 2-й строки, пропуская 1-ю строку. Кажется, это работает, но лучше ли это сделать?

            using (StreamReader sr = new StreamReader(varFile, Encoding.GetEncoding(1250))) {
                string[] stringSeparator = new string[] { "\",\"" };
                int i = 0;
                while (!sr.EndOfStream) {                    
                    string line = sr.ReadLine(); //.Trim('"');
                    if (i > 0) {
                        string[] values = line.Split(stringSeparator, StringSplitOptions.None);

                        for (int index = 0; index < values.Length; index++) {

                            MessageBox.Show(values[index].Trim('"'));
                        }
                    }
                    i++;
                }
            }

Ответы [ 3 ]

12 голосов
/ 11 апреля 2011

Если файл не очень большой и может уместиться в памяти:

foreach (var line in File.ReadAllLines(varFile, Encoding.GetEncoding(1250)).Skip(1))
{
    string[] values = line.Split(',');
    ...
}

Если не написать итератор:

public IEnumerable<string> ReadAllLines(string filename, Encoding encoding)
{
    using (var reader = new StreamReader(filename, encoding))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

, а затем потреблять его:

foreach (var line in ReadAllLines(varFile, Encoding.GetEncoding(1250)).Skip(1))
{
    string[] values = line.Split(',');
    ...
}
6 голосов
/ 11 апреля 2011

Не могли бы вы просто прочитать первую строку за пределами цикла, не присвоив ее переменной?

using (StreamReader sr = new StreamReader(varFile, Encoding.GetEncoding(1250))) {
            string[] stringSeparator = new string[] { "\",\"" };
            if (!sr.EndOfStream)
                sr.ReadLine();
            while (!sr.EndOfStream) {                    
                string line = sr.ReadLine(); //.Trim('"');
                string[] values = line.Split(stringSeparator, StringSplitOptions.None);

                for (int index = 0; index < values.Length; index++) {
                    MessageBox.Show(values[index].Trim('"'));
                }
            }
        }
1 голос
/ 11 апреля 2011

Извините, но я не вижу проблем с тем, как вы это делаете. Я не могу добавить комментарий.

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

Обновлен:

Чтобы дать более полный ответ, вызов ReadLine (), когда поток заканчивается, вернет ноль.

Ссылка: http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

Не забудьте проверить возврат на нулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...