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