首页 > 解决方案 > 如何在 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.

提前致谢。

标签: c#asp.netlinqcsvfile-io

解决方案


你写了:

我的问题是现在我不能使用 .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();
}

好消息是,如果您只想读取几行,而不是读取整个文件!


推荐阅读