C# 从CSV文件中读取最新一行

C# 从CSV文件中读取最新一行,c#,csv,C#,Csv,我有一个CSV文件,需要从中读取所有值。但只有最后一排是最新的。但我不知道怎么做 我现在使用的是streamreader,但是它会遍历整个CSV文件,这个文件可能非常大 我需要读取两个不同的csv文件头是相同的,但在不同的位置 但是如何编辑此代码以仅读取最后一行?我到处找了找,但找不到和我一样的东西 我现在就是这样做的: using (var reader = new StreamReader(path)) { var headerLine

我有一个CSV文件,需要从中读取所有值。但只有最后一排是最新的。但我不知道怎么做

我现在使用的是streamreader,但是它会遍历整个CSV文件,这个文件可能非常大

我需要读取两个不同的csv文件头是相同的,但在不同的位置

但是如何编辑此代码以仅读取最后一行?我到处找了找,但找不到和我一样的东西

我现在就是这样做的:

using (var reader = new StreamReader(path))
            {
                var headerLine = reader.ReadLine();
                var headerValues = headerLine.Split(',');
                var serialNumber = headerValues[66];

                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split(',');

                    if (values[0] != "Index")
                    {
                        var analyseReport = new AnalyseReport();
                        analyseReport.SerialNumber = serialNumber;

                        foreach (var item in headerValues)
                        {
                            var headerName = item.Trim();
                            var index = Array.IndexOf(headerValues, item);

                            switch (headerName)
                            {
                                case "Index":
                                    analyseReport.Index = Convert.ToInt32(values[index].Trim());
                                    break;

                                case "Time":
                                    analyseReport.TimeStamp = Convert.ToDateTime(values[index].Trim());
                                    break;

                                case "Reading No":
                                    analyseReport.ReadingNo = Convert.ToInt32(values[index].Trim());
                                    break;
                                case "Duration":
                                    analyseReport.Duration = values[index].Trim();
                                    break;

                                case "Type":
                                    analyseReport.Type = values[index].Trim();
                                    break;

                                case "Units":
                                    analyseReport.Units = values[index].Trim();
                                    break;

                                default:
                                    break;
                            }
                        }

                        analyseReportList.Add(analyseReport);

                    }
                }
                return analyseReportList;
            }
您可以使用File.ReadLinespath.Last:

这些是LINQ方法,因此需要使用System.LINQ;添加

您可以使用File.ReadLinespath.Last:


这些是LINQ方法,因此需要使用System.LINQ;添加

如果您没有固定长度的行,但可以确定行长度的上限,则可以使用启发式方法使阅读最后一行更有效

基本上要做的是将文件流的当前位置从末尾移动到n字节,然后读取,直到到达最后一行

private string ReadLastLine(string fileName, int maximumLineLength)
{
    string lastLine = string.Empty;

    using(Stream s = File.OpenRead(path))
    {
        s.Seek(-maximumLineLength, SeekOrigin.End);

        using(StreamReader sr = new StreamReader(s))
        {
            string line;

            while((line = sr.ReadLine()) != null)
            {
                lastLine = line;
            }
        }
    }

    return lastLine;
}
对于1.8 MB的CSV,它比File.ReadLines方法快100-200倍。无论如何,以一种更复杂的代码为代价

备注:虽然您可以使用此方法优化最后一行的阅读,但如果这确实是瓶颈,请尽可能使用Tim Schmelter的更清晰版本。请记住优化的第二条规则:暂时不要这样做


更重要的是,要确定行的最大长度,必须小心,并考虑字符编码。不要高估而不是低估行长。

如果您没有固定长度的行,但可以确定行长的上限,您可以使用启发式方法使阅读最后一行更有效

基本上要做的是将文件流的当前位置从末尾移动到n字节,然后读取,直到到达最后一行

private string ReadLastLine(string fileName, int maximumLineLength)
{
    string lastLine = string.Empty;

    using(Stream s = File.OpenRead(path))
    {
        s.Seek(-maximumLineLength, SeekOrigin.End);

        using(StreamReader sr = new StreamReader(s))
        {
            string line;

            while((line = sr.ReadLine()) != null)
            {
                lastLine = line;
            }
        }
    }

    return lastLine;
}
对于1.8 MB的CSV,它比File.ReadLines方法快100-200倍。无论如何,以一种更复杂的代码为代价

备注:虽然您可以使用此方法优化最后一行的阅读,但如果这确实是瓶颈,请尽可能使用Tim Schmelter的更清晰版本。请记住优化的第二条规则:暂时不要这样做


更重要的是,要确定行的最大长度,必须小心,并考虑字符编码。如果你有固定长度的线条是一个好答案。如果你有固定长度的线条是一个好答案。但是这不是仍然可以阅读所有的线条,这是OP试图避免的吗?@PaulKertscher:你不能避免,但他不会像目前那样处理所有行,他会保持代码简洁易读。可枚举。First只读取第一行,Last将读取所有行,但不处理它们,它只返回最后一行。谢谢,我会尝试一下。@AndreasPettersson:请记住,您应该使用ReadLines而不是ReadAllLines。后者确实把所有的行都读入了内存。@Evk:你可以试试乔恩·斯凯茨的方法,我还没有测试过。我怀疑这会让你的代码更具可读性:我也怀疑这是OP真正想要的。他只是想避免处理循环中的所有行。但这不是仍然会读取所有行吗?这正是OP试图避免的?@PaulKertscher:你不能避免,但他不会像目前那样处理所有行,他会保持代码简洁易读。可枚举。First只读取第一行,Last将读取所有行,但不处理它们,它只返回最后一行。谢谢,我会尝试一下。@AndreasPettersson:请记住,您应该使用ReadLines而不是ReadAllLines。后者确实把所有的行都读入了内存。@Evk:你可以试试乔恩·斯凯茨的方法,我还没有测试过。我怀疑这会让你的代码更具可读性:我也怀疑这是OP真正想要的。他只是想避免处理循环中的所有行。