【问题标题】:How to get csv row count in CsvHelper如何在 CsvHelper 中获取 csv 行数
【发布时间】:2019-09-30 01:34:07
【问题描述】:

我正在为我的 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));
        }

【问题讨论】:

  • 你好,我在看这个函数。你能分享一下如何完全做到这一点吗?
  • 嗨@Haohao1198,你可以在我的仓库github.com/josebalerosjr/Intranet查看它。它在 Intranet > Controllers > BdoPEController
  • 你好,@Jose Baleros Jr,谢谢!!

标签: c# asp.net-core-mvc entity-framework-core asp.net-core-2.2 csvhelper


【解决方案1】:

线

try { users = stream.CsvToList<BDOCsv>(); }

每次读取文件时都会覆盖users 列表。所以当你这样做时

while (i < users.Count)

users 列表仅包含最后读入的用户文件。

试试改成

try { users.AddRange(stream.CsvToList<BDOCsv>(); }

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

【讨论】:

  • 嗨 @Simple Ged 先生,谢谢您的回答,现在可以获取行数,但是在第一个循环发生错误后,我在代码的最后一部分 i++; _context.Add(bdoToDb); await _context.SaveChangesAsync(); 遇到了另一个错误表示身份插入设置为关闭。
  • @josebalerosjr 您能否针对您的新问题创建一个新问题。确保为您的问题创建minimal reproducible example,而不是发布所有代码(您可能会在创建minimal reproducible example 时发现您自己解决了问题:-))
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多