我希望能够遍历CSV文件中的所有记录,并将所有好的记录添加到一个集合中,并分别处理所有“坏的”记录。我似乎无法做到这一点,我想我一定很想念。
如果我尝试捕获BadDataException,则后续读取将失败,这意味着我无法继续读取该文件的其余部分-
while (true)
{
try
{
if (!reader.Read())
break;
var record = reader.GetRecord<Record>();
goodList.Add(record);
}
catch (BadDataException ex)
{
// Exception is caught but I won't be able to read further rows in file
// (all further reader.Read() result in same exception thrown)
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
讨论的另一个选项是设置BadDataFound回调操作来处理它-
reader.Configuration.BadDataFound = x =>
{
Console.WriteLine($"Bad data: <{x.RawRecord}>");
};
Run Code Online (Sandbox Code Playgroud)
但是,尽管称为回调,但不良记录仍然会出现在我的“良好列表”中
在将其添加到列表之前,有什么方法可以查询读者以查看记录是否良好?
对于此示例,我的记录定义为-
class Record
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age …Run Code Online (Sandbox Code Playgroud) 我必须使用(即我无法控制)csv文件,其中“ N / A”是“应该”为整数的字段的可能值,并且我一直在尝试找出如何“滚动自己的” TypeConversion类来处理此问题,但未能找到示例。Josh的例子页面在这一特定领域明显缺乏和最近的计算器的问题,我已经能够找到的是这个从2013年。
然后,我找到了对NullValuesAttribute的引用,这似乎正是我所需要的,但是后来却不知道如何使用它。VisualStudio的Intellisense也无济于事。:)
理想情况下,我希望将“ N / A”转换为0(零)。有人可以帮忙吗?
在人们告诉我“好吧,很明显...”之前,我应该说这是我的第一个C#程序(从字面上讲,除了教程),而且还有一个时间因素-否则我会很开心地自己探索。
[更新:在CsvHelper中尝试了顶级自适应解决方案,从String解析布尔值 ]
因此,以上述问题的解决方案为起点,我这样做了:
static void Main()
{
var rows = new List<Job>();
using (var reader = new StreamReader("mydatafile.csv")
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<JobMap>();
while (csv.Read())
{
var record = new Job
{
JobId = csv.GetField<int>("Job ID"),
ItemCount = csv.GetField<int>("Item Count")
};
rows.Add(record);
}
}
}
public class Job
{
public int JobId { get; set; }
public int ItemCount { get; …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助,用 C# 中的 CSV Helper 进行 CSV 解析
我的示例文件是
"SKU","Title","URL","BP","SP","NumberOf","Wid1","Wid2","Wid3"
"Big Corp","CRM updates","test","0","0","0","0","0","0"
"Big Corp 1","CRM "test" updates","test","0","0","0","0","0","0"
Run Code Online (Sandbox Code Playgroud)
我的配置是
using (TextReader reader = File.OpenText(location))
{
using (var csv = new CsvReader(reader, System.Globalization.CultureInfo.CurrentCulture))
{
csv.Configuration.RegisterClassMap<ProductMap>();
List<Product> records = csv.GetRecords<Product>().ToList();
return records;
}
}
Run Code Online (Sandbox Code Playgroud)
我在最后一行中收到错误,其中 1 个字段中有双引号。如果我想转义/删除双引号,我需要做什么设置?
我还尝试替换映射文件中的双引号,但双引号显示在错误的位置。双引号位于“测试”一词上,但在数据中它们显示在“更新”一词上。
进而
我可以在映射文件中用空字符串替换双引号,但是还有其他解决方案吗?
我正在使用 CsvHelper 并且能够解析 csv 文件。我的问题是如何解析DateintoDateTime对象
我想在解析 csv 而不是迭代集合时通过 CsvHelper 转换它
public static List<StockModel> SplitCsv(string csv)
{
var textReader = new StringReader(csv);
var csvr = new CsvReader(textReader);
csvr.Configuration.RegisterClassMap<ModelMap>();
var records = csvr.GetRecords<StockModel>().ToList();
return records;
}
public class StockModel
{
public string Date { get; set; } // I want this object to be DateTime
public string Base { get; set; }
public string Open { get; set; }
}
public sealed class ModelMap : CsvClassMap<StockModel>
{
public …Run Code Online (Sandbox Code Playgroud) 我正在使用 CsvHelper。在这里,我试图从 ftp 下载一个 csv 文件并写入一个类。它抛出一个错误 - 无法访问已处理的对象。对象名称:System.Net.Sockets.NetworkStream。从行 - IEnumerable 记录 = csv.GetRecords().ToList();
任何的想法?
request.Credentials = new NetworkCredential(ftpUser, ftpPwd);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.UseBinary = true;
// Csv file
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (TextReader tr = new StreamReader(responseStream))
{
using (CsvReader csv = new CsvReader(tr))
{
if (csvUpload.IncludeInvoice) csv.Configuration.RegisterClassMap<PacketUploadInvoiceMasterMap>();
else csv.Configuration.RegisterClassMap<PacketUploadBasicMasterMap>();
IEnumerable<PacketUploadMaster> records = csv.GetRecords<PacketUploadMaster>().ToList();
pumResults = records.ToList();
}
}
}
}
response.Close();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试读取标题位于第 3 行的 CSV 文件:
some crap line
some empty line
COL1,COL2,COl3,...
val1,val2,val3
val1,val2,val3
Run Code Online (Sandbox Code Playgroud)
如何告诉CSVHelper标题不在第一行?
我试图跳过 2 行,Read()但随后的调用ReadHeader()引发了一个异常,表明标题已被读取。
using (var csv = new CsvReader(new StreamReader(stream), csvConfiguration)) {
csv.Read();
csv.Read();
csv.ReadHeader();
.....
Run Code Online (Sandbox Code Playgroud)
如果我设置csvConfiguration.HasHeaderRecord为false ReadHeader()再次失败。
我正在使用 CsvHelper 库从 生成一个 CSV 文件IEnumerable<Person>,其中Person是一个基本类。
public class Person
{
public string DisplayName { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要写带引号的标题,即不是“DisplayName”,结果文件中的列应该是“Display Name”。
我怎样才能做到这一点?
我正在使用优秀的 CsvHelper 库(当前为 v12.2.2)来生成 CSV 文件,并且我正在尝试添加自己的自定义属性以直接在类中指定特殊格式。
我正在编写的记录如下所示(尽管集成需要约 200 个数字字段):
class PayrollRecord {
public int EmployeeID { get; set; }
public decimal RegularPay { get; set; }
public decimal RegularHours { get; set; }
public decimal RegularRate { get; set; }
public decimal OvertimePay { get; set; }
public decimal OvertimeHours { get; set; }
public decimal OvertimeRate { get; set; }
// many many more
}
Run Code Online (Sandbox Code Playgroud)
我需要确保“工资”为小数点后两位,“小时”为 3 位,工资率为 4 位;集成需要这个。
我创建了一个十进制转换器,并将其附加到类映射中:
using CsvHelper;
using CsvHelper.TypeConversion;
// convert decimal …Run Code Online (Sandbox Code Playgroud) 我正在使用CsvHelper库将 CSV 数据解析为 C# 对象。到目前为止,我可以用这 3 列解析这个类的所有内容。
public class Foo
{
public string Id { get; set; }
public decimal Amount { get; set; }
public string CurrencyCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但在我添加 DateTime 属性后,它就崩溃了。添加新列后的类。
public class Foo
{
public string Id { get; set; }
public decimal Amount { get; set; }
public string CurrencyCode { get; set; }
public DateTime TransactionDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的配置
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = …Run Code Online (Sandbox Code Playgroud) 当我尝试使用 CsvHelper 解析下面的 CSV 时,出现“无法执行转换”错误(完整错误如下)。看起来我遗漏了一些关于如何处理以小数形式读取值的信息。已经看到了一些与设置文化有关的其他答案,但这似乎没有帮助。
\nCSV 数据为:
\nTitle,Amount,NHS,Reference,GoCardless ID,email,surname,firstname,Full Name,DOB,Age,Right Lens,Left Lens,RightLensMonthlyAmount,LeftLensMonthlyAmount,LensMonthlyAmount,FeeMonthlyAmount,VAT Basis,LensBespokePrice,CareOnly,Notes\nMrs,24.3,N,100247,CUXXX,email@gmail.com,User,Test,Test User,17/09/1957,64,DAILIES\xc2\xae AquaComfort PLUS 30 Pack,DAILIES\xc2\xae AquaComfort PLUS 30 Pack,16.5,16.5,33,6.35,,,,\nRun Code Online (Sandbox Code Playgroud)\n我的类将此数据映射到属性是:
\npublic class Payer\n {\n public string Title { get; set; }\n public decimal Amount { get; set; }\n\n [BooleanTrueValues("Y")]\n [BooleanFalseValues("N")]\n public bool NHS { get; set; }\n\n public string Reference { get; set; }\n\n [Name("GoCardless ID")]\n public string GoCardless_ID { get; set; }\n\n public string email { get; set; }\n public string surname …Run Code Online (Sandbox Code Playgroud)