如何使用 CsvHelper 解决 CSV 映射问题
How to solve problem with CSV Mapping using CsvHelper
我有一个包含多个字段的 CSV 文件(查看下面的格式)
ArticleNumber;Shop1;Shop2;Shop3;Shop4;Shop5;Shop6;Shop7
123455;50;51;52;53;54;55;56
在 Shop1,Shop2....Shop7 字段中,我有产品价格。我收到这样的文件,所以我需要找到一种很酷的方法来解决我的问题。
我想使用 CsvHelper 库读取此 CSV,但我不知道如何映射字段。结果我想要这样的东西:
ArticleNumber
Shop
Price
123455
Shop1
50
123455
Shop2
51
123455
Shop3
52
123455
Shop4
53
123455
Shop5
54
123455
Shop6
55
你的CSV文件的格式是固定的,还是可以更改的?
如果可以更改,您可以将其更改为
ArticleNumber;Shop;Price
123455;Shop1;50
123455;Shop2;51
等等
编辑:正如我在评论中所说,您也可以这样做(这只是伪代码,我没有打开 c#)
class PriceForArticle{
int articleNumber;
string shopName;
float price;
}
然后您将使用此 Methode 将它们初始化为 PriceForArticle
列表
List<PriceForArticle> prices = new List<PriceForArticle>();
for(int j = 1; j < AllArticles.Length; j++){
for(int i = 1; i < AllArticles[j].Length; i++){
prices.Add(new PriceForArticle(AllArticles[j][0], AllArticles[0][i], AllArticles[j][i]));
}
}
我认为这将为您提供所需的格式。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";"
};
using (var reader = new StringReader("ArticleNumber;Shop1;Shop2;Shop3;Shop4;Shop5;Shop6;Shop7\n123455;50;51;52;53;54;55;56\n123456;60;61;62;63;64;65;66"))
using (var csv = new CsvReader(reader, config))
{
csv.Context.RegisterClassMap<ArticleMap>();
csv.Read();
csv.ReadHeader();
var shops = csv.HeaderRecord.Skip(1).ToArray();
var records = csv.GetRecords<Article>().ToList();
var results = records.SelectMany(r => r.Shop
.Select((s, i) => new ArticleShop
{
ArticleNumber = r.ArticleNumber,
Shop = shops[i],
Price = s
})
).ToList();
}
}
public class ArticleMap : ClassMap<Article>
{
public ArticleMap()
{
Map(x => x.ArticleNumber);
Map(x => x.Shop).Index(1);
}
}
public class Article
{
public int ArticleNumber { get; set; }
public List<double> Shop { get; set; }
}
public class ArticleShop
{
public int ArticleNumber { get; set; }
public string Shop { get; set; }
public double Price { get; set; }
}
我有一个包含多个字段的 CSV 文件(查看下面的格式)
ArticleNumber;Shop1;Shop2;Shop3;Shop4;Shop5;Shop6;Shop7
123455;50;51;52;53;54;55;56
在 Shop1,Shop2....Shop7 字段中,我有产品价格。我收到这样的文件,所以我需要找到一种很酷的方法来解决我的问题。 我想使用 CsvHelper 库读取此 CSV,但我不知道如何映射字段。结果我想要这样的东西:
ArticleNumber | Shop | Price |
---|---|---|
123455 | Shop1 | 50 |
123455 | Shop2 | 51 |
123455 | Shop3 | 52 |
123455 | Shop4 | 53 |
123455 | Shop5 | 54 |
123455 | Shop6 | 55 |
你的CSV文件的格式是固定的,还是可以更改的? 如果可以更改,您可以将其更改为
ArticleNumber;Shop;Price
123455;Shop1;50
123455;Shop2;51
等等
编辑:正如我在评论中所说,您也可以这样做(这只是伪代码,我没有打开 c#)
class PriceForArticle{
int articleNumber;
string shopName;
float price;
}
然后您将使用此 Methode 将它们初始化为 PriceForArticle
列表List<PriceForArticle> prices = new List<PriceForArticle>();
for(int j = 1; j < AllArticles.Length; j++){
for(int i = 1; i < AllArticles[j].Length; i++){
prices.Add(new PriceForArticle(AllArticles[j][0], AllArticles[0][i], AllArticles[j][i]));
}
}
我认为这将为您提供所需的格式。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";"
};
using (var reader = new StringReader("ArticleNumber;Shop1;Shop2;Shop3;Shop4;Shop5;Shop6;Shop7\n123455;50;51;52;53;54;55;56\n123456;60;61;62;63;64;65;66"))
using (var csv = new CsvReader(reader, config))
{
csv.Context.RegisterClassMap<ArticleMap>();
csv.Read();
csv.ReadHeader();
var shops = csv.HeaderRecord.Skip(1).ToArray();
var records = csv.GetRecords<Article>().ToList();
var results = records.SelectMany(r => r.Shop
.Select((s, i) => new ArticleShop
{
ArticleNumber = r.ArticleNumber,
Shop = shops[i],
Price = s
})
).ToList();
}
}
public class ArticleMap : ClassMap<Article>
{
public ArticleMap()
{
Map(x => x.ArticleNumber);
Map(x => x.Shop).Index(1);
}
}
public class Article
{
public int ArticleNumber { get; set; }
public List<double> Shop { get; set; }
}
public class ArticleShop
{
public int ArticleNumber { get; set; }
public string Shop { get; set; }
public double Price { get; set; }
}