如何在C#中跳过第一行并从第二行开始读取文件

3
如何从第二行开始读取文件,跳过第一行。这个方法似乎可行,但是否是最佳方法呢?
            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个回答

13

如果文件不是很大,可以放入内存中:

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(',');
    ...
}

谢谢。我有足够的内存来容纳这个,所以第一个选项会很好。 - MadBoy

6

你不可以在循环外面仅读取第一行而不将它赋值给一个变量吗?

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('"'));
                }
            }
        }

看起来它运行良好,但我会选择Darin的选项。这似乎是更加“简洁”的方式来实现 :-) - MadBoy

1

很抱歉,我认为你的方法没有问题。但是我无法添加评论。

所以为了回答这个问题,你可以在循环之前尝试调用ReadLine()一次。虽然我不知道如果已经到达流的末尾运行ReadLine()的行为是什么,但这可能不是最好的方法,但如果什么都不会发生,那么这将节省您一些检查。

更新:

为了给出更完整的答案,当流结束时调用ReadLine()将返回null。

参考:http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

记得检查返回值是否为null。


2
如果你不知道,为什么要回答呢?猜测对任何人都没有帮助。 - jgauffin
我回答是因为我想让他知道我认为他的方法相当不错,这也是他所询问的。是的,skip()是一个很好的方法,更直观和易读,但我不明白skip的底层代码如何不使用一些读取行或字符搜索并遍历直到特定行已跳过。我不是在猜测,我只是根据我的感觉发表评论。看看如果我有评论的能力,我会这样做的。这就是为什么我提到我不能评论的原因。 - lxcid
我指的是“如果已经到达流的末尾,ReadLine()的行为是什么”。 - jgauffin
我将-1票改为+1票。如果你想回答问题,你应该始终知道自己在说什么。在回答中猜测只会使它们变成噪音,没有帮助。 - jgauffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接