【发布时间】:2018-07-20 08:34:06
【问题描述】:
我正在改进某人的代码。 基本上,这家伙写它是为了直接从一个单独的控制台项目的文件夹路径中读取一个 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();
}
ApiRepository
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;
}
【问题讨论】:
-
到目前为止你尝试过什么?什么不工作?
-
您需要描述输入文件的格式。如果你有 byte[] 那么文件是二进制的,二进制结构将决定解析的方法。我上周在这篇文章中做了一个二进制解析器:stackoverflow.com/questions/51321476/…
-
@jdweng 我输入了我创建的方法,请帮我看看。我知道我需要更改流读取器路径,以便它可以读取/转换 byte[] 以进行处理,但我不知道该怎么做。
-
您需要使用 BinaryReader,它需要 Stream 而不是 StreamReader: Stream stream = File.OpenRead(inputFileDirectory); BinaryReader reader = new BinaryReader(stream);
-
@jdweng 我传入了 3 个数据类型 'public byte[] Content { get;放; } 公共 int CompanyId { 获取;放; } 公共字符串文件名 { 获取;放; }' 在 ImportUserDTO 我想不出办法
标签: c# csv filereader