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