标签: csvhelper

在CsvHelper中处理错误的CSV记录

我希望能够遍历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)

c# csv csvhelper

7
推荐指数
1
解决办法
6606
查看次数

“ N / A”作为int字段的空值

我必须使用(即我无法控制)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# csvhelper

7
推荐指数
1
解决办法
244
查看次数

CSV Helper,读取字段数据中带双引号的文件

我需要一些帮助,用 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 个字段中有双引号。如果我想转义/删除双引号,我需要做什么设置?

我还尝试替换映射文件中的双引号,但双引号显示在错误的位置。双引号位于“测试”一词上,但在数据中它们显示在“更新”一词上。

在此输入图像描述

进而

在此输入图像描述

我可以在映射文件中用空字符串替换双引号,但是还有其他解决方案吗?

c# double-quotes csvhelper

7
推荐指数
1
解决办法
6078
查看次数

CsvHelper 解析 csv 并将字符串转换为 DateTime

我正在使用 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)

c# csv csvhelper

6
推荐指数
1
解决办法
8769
查看次数

无法访问已处置的对象。对象名称:System.Net.Sockets.NetworkStream

我正在使用 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)

c# ftpwebrequest csvhelper

6
推荐指数
1
解决办法
1万
查看次数

如何使用 CsvHelper 从特定行读取标题?

我正在尝试读取标题位于第 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.HasHeaderRecordfalse ReadHeader()再次失败。

.net c# csv csvhelper

6
推荐指数
1
解决办法
6479
查看次数

如何使用 CsvHelper 编写带有空格的标题?

我正在使用 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”。

我怎样才能做到这一点?

c# csvhelper

6
推荐指数
1
解决办法
2699
查看次数

向 CsvHelper 添加自定义字段属性

我正在使用优秀的 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)

c# csvhelper

6
推荐指数
1
解决办法
4914
查看次数

CsvHelper C# 日期时间格式 dd/mm/yyyy

我正在使用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

6
推荐指数
1
解决办法
8632
查看次数

使用 CsvHelper 时转换为十进制

当我尝试使用 CsvHelper 解析下面的 CSV 时,出现“无法执行转换”错误(完整错误如下)。看起来我遗漏了一些关于如何处理以小数形式读取值的信息。已经看到了一些与设置文化有关的其他答案,但这似乎没有帮助。

\n

CSV 数据为:

\n
Title,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,,,,\n
Run Code Online (Sandbox Code Playgroud)\n

我的类将此数据映射到属性是:

\n
public 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)

c# csvhelper

6
推荐指数
1
解决办法
4336
查看次数

标签 统计

csvhelper ×10

c# ×9

csv ×3

.net ×1

double-quotes ×1

ftpwebrequest ×1