【问题标题】:How to skip first line and start reading file from second line in C#如何在 C# 中跳过第一行并从第二行开始读取文件
【发布时间】:2011-04-11 17:17:19
【问题描述】:

如何跳过第一行从第二行开始读取文件。这似乎可行,但这是最好的方法吗?

            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++;
                }
            }

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    如果文件不是很大并且可以放入内存:

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

    【讨论】:

    • 谢谢。我有足够的内存来适应这个,所以第一个选项会很好。
    【解决方案2】:

    你不能只读取循环外的第一行而不将其分配给变量吗?

    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 选项。这样做似乎更“干净”:-)
    【解决方案3】:

    很抱歉,不过我认为您的操作方式没有问题。我无法添加评论。

    所以只是为了回答,您可能已经尝试在循环之前调用一次ReadLine()。可能不是最好的方法,因为如果 ReadLine() 已经结束,我不知道运行 ReadLine() 的行为是什么,但它什么都不会发生,那么这将为您节省一些检查。

    更新:

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

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

    记得检查返回的空值。

    【讨论】:

    • 不知道为什么还要回答?猜测对任何人都没有帮助。
    • 我回答是因为我想让他知道我认为他的方式很体面,这就是他所问的。是的,skip() 是一种很好的方法,更直观,更易读,但我不知道在跳过特定行之前,skip 的底层代码不会使用一些读取行或字符搜索和横向。我不是在猜测,我只是根据我的感受发表评论。看看我是否有能力发表评论,我会做到的。这就是为什么我提到我无法发表评论。
    • 我指的是I don't know whats the behavior of running ReadLine() if its already end of stream
    • 我将 -1 投票更改为 +1。如果你想回答问题,你应该总是知道你在说什么。猜测答案只会成为噪音,并没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多