如何在 CsvHelper 中获取 csv 行数
How to get csv row count in CsvHelper
我正在为我的 Asp.net Core 2.2 MVC EF 应用程序使用 CsvHelper。上传 csv 逗号分隔文件后,我可以读取数据并将其插入到我的数据库中。但是当 csv 文件里面有很多行时,它只插入第一行,即使 csv 文件里面有 10 行。下面是我的控制器代码:
我希望你能帮助我。 TIA.
[HttpPost("textCsv")]
public async Task<IActionResult> textCsv([Bind("CompanyCode,ProductCode,TransactionDate,TransactionTime,OriginatingBranch,CustomerNumber,TransactionOrigin,TypeOfPayment,CheckNumber,TransactionAmount,CustomerName,UserName,UserIP,UserDate")]BdoToDb bdoToDb, List<IFormFile> files)
{
UserDetails();
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filepath = Path.GetTempFileName();
var users = new List<BDOCsv>();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = formFile.OpenReadStream())
{
try { users = stream.CsvToList<BDOCsv>(); }
catch (Exception ex) { return BadRequest(ex.Message); }
}
}
}
int i = 0;
while (i < users.Count)
{
ViewBag.CompanyCode = users[i].CompanyCode;
ViewBag.ProductCode = users[i].ProductCode;
ViewBag.TransactionDate = users[i].TransactionDate;
ViewBag.TransactionTime = users[i].TransactionTime;
ViewBag.OriginatingBranch = users[i].OriginatingBranch;
ViewBag.CustomerNumber = users[i].CustomerNumber;
ViewBag.TransactionOrigin = users[i].TransactionOrigin;
ViewBag.TypeOfPayment = users[i].TypeOfPayment;
ViewBag.CheckNumber = users[i].CheckNumber;
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;
bdoToDb.TransactionDate = ViewBag.TransactionDate;
bdoToDb.TransactionTime = ViewBag.TransactionTime;
bdoToDb.OriginatingBranch = ViewBag.OriginatingBranch;
bdoToDb.CustomerNumber = ViewBag.CustomerNumber;
bdoToDb.TransactionOrigin = ViewBag.TransactionOrigin;
bdoToDb.TypeOfPayment = ViewBag.TypeOfPayment;
bdoToDb.CheckNumber = ViewBag.CheckNumber;
bdoToDb.TransactionAmount = ViewBag.TransactionAmount;
bdoToDb.CustomerName = ViewBag.CustomerName;
bdoToDb.UserName = ViewBag.DisplayName;
bdoToDb.UserIP = HttpContext.Connection.RemoteIpAddress.ToString();
bdoToDb.UserDate = DateTime.Now.ToString("MM/dd/yyyy");
i++;
_context.Add(bdoToDb);
await _context.SaveChangesAsync();
}
//return View();
return RedirectToAction(nameof(Index));
}
行
try { users = stream.CsvToList<BDOCsv>(); }
每次读取文件时都会覆盖 users
列表。所以当你做
while (i < users.Count)
users
列表仅包含读入的最后一个用户文件。
尝试将其更改为
try { users.AddRange(stream.CsvToList<BDOCsv>(); }
这会将新用户添加到现有列表中,而不是替换它们。
我正在为我的 Asp.net Core 2.2 MVC EF 应用程序使用 CsvHelper。上传 csv 逗号分隔文件后,我可以读取数据并将其插入到我的数据库中。但是当 csv 文件里面有很多行时,它只插入第一行,即使 csv 文件里面有 10 行。下面是我的控制器代码: 我希望你能帮助我。 TIA.
[HttpPost("textCsv")]
public async Task<IActionResult> textCsv([Bind("CompanyCode,ProductCode,TransactionDate,TransactionTime,OriginatingBranch,CustomerNumber,TransactionOrigin,TypeOfPayment,CheckNumber,TransactionAmount,CustomerName,UserName,UserIP,UserDate")]BdoToDb bdoToDb, List<IFormFile> files)
{
UserDetails();
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filepath = Path.GetTempFileName();
var users = new List<BDOCsv>();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = formFile.OpenReadStream())
{
try { users = stream.CsvToList<BDOCsv>(); }
catch (Exception ex) { return BadRequest(ex.Message); }
}
}
}
int i = 0;
while (i < users.Count)
{
ViewBag.CompanyCode = users[i].CompanyCode;
ViewBag.ProductCode = users[i].ProductCode;
ViewBag.TransactionDate = users[i].TransactionDate;
ViewBag.TransactionTime = users[i].TransactionTime;
ViewBag.OriginatingBranch = users[i].OriginatingBranch;
ViewBag.CustomerNumber = users[i].CustomerNumber;
ViewBag.TransactionOrigin = users[i].TransactionOrigin;
ViewBag.TypeOfPayment = users[i].TypeOfPayment;
ViewBag.CheckNumber = users[i].CheckNumber;
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;
bdoToDb.TransactionDate = ViewBag.TransactionDate;
bdoToDb.TransactionTime = ViewBag.TransactionTime;
bdoToDb.OriginatingBranch = ViewBag.OriginatingBranch;
bdoToDb.CustomerNumber = ViewBag.CustomerNumber;
bdoToDb.TransactionOrigin = ViewBag.TransactionOrigin;
bdoToDb.TypeOfPayment = ViewBag.TypeOfPayment;
bdoToDb.CheckNumber = ViewBag.CheckNumber;
bdoToDb.TransactionAmount = ViewBag.TransactionAmount;
bdoToDb.CustomerName = ViewBag.CustomerName;
bdoToDb.UserName = ViewBag.DisplayName;
bdoToDb.UserIP = HttpContext.Connection.RemoteIpAddress.ToString();
bdoToDb.UserDate = DateTime.Now.ToString("MM/dd/yyyy");
i++;
_context.Add(bdoToDb);
await _context.SaveChangesAsync();
}
//return View();
return RedirectToAction(nameof(Index));
}
行
try { users = stream.CsvToList<BDOCsv>(); }
每次读取文件时都会覆盖 users
列表。所以当你做
while (i < users.Count)
users
列表仅包含读入的最后一个用户文件。
尝试将其更改为
try { users.AddRange(stream.CsvToList<BDOCsv>(); }
这会将新用户添加到现有列表中,而不是替换它们。