c# - 如何在 ASP.NET 中读取上传的 CSV 文件并跳过第一行?
问题描述
当文件存储在本地时,我能够读取 CSV 文件并使用它。在这里,我有存储在我的 PC 上的文件的路径。我想跳过 csv 中的第一行,只阅读以下几行并存储它们。为此,我使用以下代码段,它工作正常。
public void ReadCSV(string path)
{
var data = File.ReadAllLines(path)
.Skip(1)
.Select(x => x.Split(';'))
//.....
}
如果文件存储在本地,我可以读取并使用它,这意味着我可以跳过第一行并将值存储到对象中。但我不知道如何处理来自前端的文件。
我用 Postman(上传文件)对其进行了测试,并制作了一个能够读取上传文件的端点。
我用了IFormFile
public async Task<string> ReadFileAsStrintAsync(IFormFile file)
{
var result = new StringBuilder();
using (var reader = new StreamReader(file.OpenReadStream()))
{
while (reader.Peek() >= 0)
result.AppendLine(await reader.ReadLineAsync());
}
return result.toString();
}
这会将 csv 的内容作为字符串发送给我。
我的问题是现在我不能像这样使用 LINQ 语句.Skip
,.Select
因为这不是IEnumerable
.
提前致谢。
解决方案
你写了:
我的问题是现在我不能使用 .Skip 和 .Select 之类的 LINQ 语句,因为这不是 IEnumerable。
因此,让我们创建一个将 TextReader(您的 StreamReader 是 TextReader)作为输入并返回一系列行的方法。
我会将它创建为扩展方法,因此您可以像使用 LINQ 方法一样使用它。如果您不熟悉扩展方法,请参阅扩展方法揭秘
public static IEnumerable<string> ToLines(this TextReader textReader)
{
string line = textReader.ReadLine();
while (line != null)
{
// we've read a line; return it
yield return line;
// read the next line or null if there is no next line:
line = textReader.ReadLine();
}
}
用法:
string csvFileName = ...
string name = ....
using (var textReader = File.OpenText(csvFileName))
{
var firstLineThatContainsNane = textReader.ToLines()
.Skip(1)
.Where(line => line.Contains(name))
.FirstOrDefault();
}
好消息是,如果您只想读取几行,而不是读取整个文件!