使用 CSVHelper 读取不同的 CSV
Reading different CSV with CSVHelper
基本上我想做的是使用 CSVHelper 读取 CSV 文件。诀窍在于有多个文件(每次用户选择不同的文件)并且每个文件都有不同的结构。
他们唯一共享的是第一个名为 "Id" 的列,然后他们每个人都有不同数量的列(从 2 个到 5 个)和不同的数据类型。
我试过这样做:
public class Country
{
public int Id { get; set; }
public IList<string> Attributes { get; set; }
}
public sealed class CountryMap : CsvClassMap<Country>
{
private List<string> attributeColumns =
new List<string> { "Attribute1", "Attribute2", "Attribute3", "Attribute4", "Attribute5" };
public override void CreateMap()
{
Map(m => m.Id).Name("Id").Index(0);
Map(m => m.Attributes).ConvertUsing(row =>
attributeColumns
.Select(column => row.GetField<string>(column))
.Where(value => String.IsNullOrWhiteSpace(value) == false)
);
}
}
然后:
using (var reader = new CsvReader(new StreamReader(FilePath,encoding.UTF8)))
{
reader.Configuration.RegisterClassMap<CountryMap>();
while (reader.Read())
{
var card = reader.GetRecord<Country>();
}
}
但我得到的只有car = null。
如果有任何提示和答案,我将不胜感激。
另一种方法是简单地使用 .Net OleDB 提供的功能从 CSV 文件为您创建数据表。由于 DataTable 已经包含必要的架构数据,因此它应该简化文件列到内部 类.
的映射
using System.Data;
using System.Data.OleDb;
using System.IO;
namespace App.Data
{
public class CsvFileHelper
{
public static DataTable ReadAsDataTable(string fileFullName)
{
DataTable tableCSV;
using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(fileFullName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""))
{
connection.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileFullName), connection))
{
DataSet ds = new DataSet("CSVDataSet");
adapter.Fill(ds);
tableCSV = ds.Tables[0];
}
}
return tableCSV;
}
}
}
基本上我想做的是使用 CSVHelper 读取 CSV 文件。诀窍在于有多个文件(每次用户选择不同的文件)并且每个文件都有不同的结构。
他们唯一共享的是第一个名为 "Id" 的列,然后他们每个人都有不同数量的列(从 2 个到 5 个)和不同的数据类型。
我试过这样做:
public class Country
{
public int Id { get; set; }
public IList<string> Attributes { get; set; }
}
public sealed class CountryMap : CsvClassMap<Country>
{
private List<string> attributeColumns =
new List<string> { "Attribute1", "Attribute2", "Attribute3", "Attribute4", "Attribute5" };
public override void CreateMap()
{
Map(m => m.Id).Name("Id").Index(0);
Map(m => m.Attributes).ConvertUsing(row =>
attributeColumns
.Select(column => row.GetField<string>(column))
.Where(value => String.IsNullOrWhiteSpace(value) == false)
);
}
}
然后:
using (var reader = new CsvReader(new StreamReader(FilePath,encoding.UTF8)))
{
reader.Configuration.RegisterClassMap<CountryMap>();
while (reader.Read())
{
var card = reader.GetRecord<Country>();
}
}
但我得到的只有car = null。
如果有任何提示和答案,我将不胜感激。
另一种方法是简单地使用 .Net OleDB 提供的功能从 CSV 文件为您创建数据表。由于 DataTable 已经包含必要的架构数据,因此它应该简化文件列到内部 类.
的映射 using System.Data;
using System.Data.OleDb;
using System.IO;
namespace App.Data
{
public class CsvFileHelper
{
public static DataTable ReadAsDataTable(string fileFullName)
{
DataTable tableCSV;
using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(fileFullName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""))
{
connection.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileFullName), connection))
{
DataSet ds = new DataSet("CSVDataSet");
adapter.Fill(ds);
tableCSV = ds.Tables[0];
}
}
return tableCSV;
}
}
}