如何通过CSV Helper解析CSV到我的自定义类IFormFile .Net Core c#

d8tt03nd  于 2023-06-19  发布在  .NET
关注(0)|答案(3)|浏览(114)

我正在将CSV文件从客户端上传到.NET CORE Web API应用程序。
我正在使用CsvHelper.net库。
我收到文件成功,我想解析到我的自定义类,这样我就可以通过csv行循环。
但是每次我得到Empty的结果就像没有行一样。
我不知道我的方法有什么问题:

[HttpPost("import")]
public async Task<ActionResult> ImportData([FromForm] IFormFile file)
{

    using var memoryStream = new MemoryStream(new byte[file.Length]);
    await file.CopyToAsync(memoryStream);
    memoryStream.Position = 0;

    using (var reader = new StreamReader(memoryStream))
    using (var csvReader = new CsvReader(reader, System.Globalization.CultureInfo.InvariantCulture))
    {
        csvReader.Read();
        var records = csvReader.GetRecords<SiteDto>();
    }

    return Ok("ok");
}

这就是我的CSV看起来像:

我的网站Dto:

public class SiteDto
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string CompanyName { get; set; }
    public string Location { get; set; }
}

当我展开我的结果时,我看到了一些类似于警告的东西?

yqkkidmi

yqkkidmi1#

我已经创建了通用csv文件转换器列表的T类型

public static class CSVParser
{
    
   
    public static DataTable ConvertCSVtoDataTable(IFormFile file)
    {
        DataTable dt = new DataTable();
        using (var stream = file.OpenReadStream())
        using (StreamReader sr = new StreamReader(stream))
        {
            string[] headers = sr.ReadLine().Split(',');
            foreach (string header in headers)
            {
                dt.Columns.Add(header);
            }
            while (!sr.EndOfStream)
            {
                string[] rows = sr.ReadLine().Split(',');
                DataRow dr = dt.NewRow();
                for (int i = 0; i < headers.Length; i++)
                {
                    dr[i] = rows[i];
                }
                dt.Rows.Add(dr);
            }

        }

        return dt;
    }
    public static List<T> ConvertDataTable<T>(DataTable dt)
    {
        List<T> data = new List<T>();
        foreach (DataRow row in dt.Rows)
        {
            T item = GetItem<T>(row);
            data.Add(item);
        }
        return data;
    }
    private static T GetItem<T>(DataRow dr)
    {
        Type temp = typeof(T);
        T obj = Activator.CreateInstance<T>();

        foreach (DataColumn column in dr.Table.Columns)
        {
            foreach (PropertyInfo pro in temp.GetProperties())
            {
                 

            if (pro.Name == column.ColumnName)
                {
                    var typeGEt = pro.PropertyType;
                    Type type = Nullable.GetUnderlyingType(pro.PropertyType) ?? pro.PropertyType;
                    string typeName = type.Name;

                   try
                    {
                        if (typeName == "Int16" || typeName == "Int32" || typeName == "Int64")
                        {
                            pro.SetValue(obj, Convert.ToInt32(dr[column.ColumnName]), null);

                        }
                        else if (typeName == "DateTime")
                        {

                            pro.SetValue(obj, DateTime.ParseExact((string)dr[column.ColumnName], "mm/dd/yyyy", CultureInfo.InvariantCulture), null);

                        }
                        else
                        {
                            pro.SetValue(obj, dr[column.ColumnName], null);

                        }
                    }

                    catch(Exception ex)
                    {
                        continue;

                    }


                }
                else
                    continue;
            }
        }
        return obj;
    }

    public static IEnumerable<T> toList<T>(this DataTable? dt)
    {
        List<T> data = new List<T>();
        foreach (DataRow row in dt.Rows)
        {
            T item = GetItem<T>(row);
            data.Add(item);
        }
        return data;
    }

    public static string getExtension(this string name)
    {
       return Path.GetExtension(name);
        
    }
    public static IEnumerable<T> CSVToList<T>(this IFormFile? file)
    {
        if (file != null)
        {
             if (file.FileName.getExtension() != ".csv")
                throw new Exception("File is not valid CSV");
            else
                return ConvertCSVtoDataTable(file).toList<T>();

        }
        else
            throw new Exception("File can not be empty");
    }
 }

用这个

postedFile.CSVToList<TypeModal>();

postedFile是IFormFile,TypeModal是Entity

slhcrj9b

slhcrj9b2#

https://joshclose.github.io/CsvHelper/getting-started
GetRecords方法将返回一个将产生记录的IEnumerable。这意味着在迭代记录时一次只返回一条记录。
尝试调用ToList()来迭代记录并删除csvReader.Read();GetRecords()在内部调用Read()。同时使用这两种方法会导致CsvReader跳过标题行。

using (var reader = new StreamReader(memoryStream))
using (var csvReader = new CsvReader(reader, System.Globalization.CultureInfo.InvariantCulture))
{
    var records = csvReader.GetRecords<SiteDto>().ToList();
}

还要向类中添加一个name属性,以便CsvHelper知道如何MapId属性。

public class SiteDto
{
    [Name("SiteId")]
    public long Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string CompanyName { get; set; }
    public string Location { get; set; }
}
0pizxfdo

0pizxfdo3#

public List<organizations> ReadCSVFile([FromForm] UploadFile location)
{
  try
  {
    using var memoryStream = new MemoryStream(new byte[location.Files.Length]);
    location.Files.CopyToAsync(memoryStream);
    memoryStream.Position = 0;
    using (var reader = new StreamReader(memoryStream))
    using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
      csvReader.Context.RegisterClassMap<organizationsMap>();
      var records = csvReader.GetRecords<organizations>().ToList();
      return records;
    }
  }
  catch (Exception e)
  {
    throw e;
  }
  return null;
}

相关问题