从CSV文件中读取最新行

时间:2018-02-19 07:34:36

标签: c# csv

我有一个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;
            }

2 个答案:

答案 0 :(得分:3)

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

基本上要做的是将文件流的当前位置从末尾移动到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更清晰,更清洁。请记住第二条优化规则:"不要这样做。"

此外,要确定线条的最大长度,您必须小心并考虑字符编码。而不是低估线长度。

答案 1 :(得分:1)

您可以使用File.ReadLines(path).Last()

string headerLine = File.ReadLines(path).First();
string lastLine = File.ReadLines(path).Last();
// ... (no loop)

这些是LINQ方法,因此您需要添加using System.Linq;