如何在 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>(); }

这会将新用户添加到现有列表中,而不是替换它们。