首页 > 解决方案 > 转换代码以读取字节并存储数据

问题描述

我正在改进某人的代码。基本上,这家伙写它是为了直接从一个单独的控制台项目的文件夹路径中读取一个 csv 文件,代码如下:

static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("Usage: ImportUser.exe <input.csv>");
            return;
        }

        string inputFileDirectory = args[0];
        string outputFileDirectory = Path.Combine(Environment.CurrentDirectory, "error.csv");

        var i = 1;
        var j = 0;

        using (var reader = new StreamReader(inputFileDirectory))
        {
            using (var writer = new StreamWriter(outputFileDirectory, false))
            {
                var csv = new CsvReader(reader);
                csv.Configuration.RegisterClassMap<RecordMapper>();
                csv.Configuration.HeaderValidated = null;
                var outCsv = new CsvWriter(writer);

                var records = csv.GetRecords<Record>();

                List<Record> BadRecords = new List<Record>();

                foreach (var record in records)
                {
                    Console.WriteLine("Processing record " + i);
                    record.Index = i++;
                    try
                    {
                        using (var db = new dcIngressDataContext())
                        {
                            ProcessRecord(db, record);
                        }
                    }
                    catch (Exception ex)
                    {
                        j++;
                        {
                            record.Error = ex.ToString();
                            Console.WriteLine(ex.ToString());
                            Console.WriteLine(record);
                            outCsv.WriteRecord<Record>(record);
                            outCsv.NextRecord();
                        }
                    }
                }
            }
        }
        Console.WriteLine(i - 1 + " records processed.");
        if (j > 0)
        {
            Console.WriteLine(j + " records not added. See error.csv for details.");
        }
        Console.WriteLine("Press Any Key To Continue...");
        Console.ReadLine();
    }

我必须将其转换为 api 方法,我将在 Byte[] 中解析文件数据。如何替换/转换第一部分,以便它读取字节 [] 并将数据放入列表?这是我来自控制器的代码-> 存储库-> webapi。

[HttpPost]
    public ActionResult UserImport(HttpPostedFileBase uploadFile)
    {
        Session currentSession = Helpers.GetCurrentSession(User.Identity);
        var companyid = currentSession.CompanyId;

        try
        {
            byte[] data;
            if (uploadFile.ContentLength > 0)
            {
                using (Stream inputStream = uploadFile.InputStream)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    data = memoryStream.ToArray();
                    var NewFile = new ImportUsers
                    {
                        CompanyId = companyid,
                        Content = data,
                    };

                    var upld = repository.Attachments.importUsers(NewFile);
                }
            }
            ViewBag.Message = "File Uploaded Successfully!!";
            return View();
        }
        catch
        {
            ViewBag.Message = "File upload failed!!";
            return View();
        }
        return View();
    }

Api 存储库

public WebApiResponse<ImportUsers> importUsers(ImportUsers file)
    {
        var response = Client.PostAsJsonAsync("api/attachments/importusers", file).Result;

        if (response.IsSuccessStatusCode)
        {
            var apiResponse = response.Content.ReadAsAsync<WebApiResponse<ImportUsers>>().Result;
            if (apiResponse.Status == ReturnStatus.SessionInvalid)
            {
                throw new InvalidSessionException();
            }
            if (apiResponse.Status == ReturnStatus.NoAccess)
            {
                throw new NoAccessException();
            }
            return apiResponse;
        }
        else
        {
            return new WebApiResponse<ImportUsers>()
            {
                Status = ReturnStatus.Failed,
                Error = "Error connecting to server. " + response.ReasonPhrase,
                Result = null
            };
        }
    }

从这里我会将字节传递给 webApi。我创建了一个方法并复制了代码,但它无法工作。

[HttpPost]
    [Route("api/attachments/importusers")]
    public WebApiResponse ImportUser([FromBody]ImportUserDTO value)
    {
        var response = new WebApiResponse();

        var i = 1;
        var j = 0;
        using (var reader = new StreamReader(inputFileDirectory))
        {
            using (var writer = new StreamWriter(outputFileDirectory, false))
            {
                var csv = new CsvReader(reader);
                csv.Configuration.RegisterClassMap<RecordMapper>();
                csv.Configuration.HeaderValidated = null;
                var outCsv = new CsvWriter(writer);

                var records = csv.GetRecords<Record>();

                List<Record> BadRecords = new List<Record>();

                foreach (var record in records)
                {
                    Console.WriteLine("Processing record " + i);
                    record.Index = i++;
                    try
                    {
                        using (var db = new ApplicationDbContext())
                        {
                            ProcessRecord(db, record);
                        }
                    }
                    catch (Exception ex)
                    {
                        j++;
                        {
                            record.Error = ex.ToString();
                            Console.WriteLine(ex.ToString());
                            Console.WriteLine(record);
                            outCsv.WriteRecord<Record>(record);
                            outCsv.NextRecord();
                        }
                    }
                }
            }
        }
        Console.WriteLine(i - 1 + " records processed.");
        if (j > 0)
        {
            Console.WriteLine(j + " records not added. See error.csv for details.");
        }
        Console.WriteLine("Press Any Key To Continue...");
        Console.ReadLine();

        return response;

    }

标签: c#csvfilereader

解决方案


我通过简单地使用 MemoryStream 找到了解决方案

Stream stream = new MemoryStream(value.Content);

代替

using (var reader = new StreamReader(inputFileDirectory))

using (var reader = new StreamReader(stream))

推荐阅读