CsvHelper - 如何配置报价设置?

发布于 2025-01-14 09:35:25 字数 1311 浏览 2 评论 0原文

当规格数据有引号(“Jake”)时,我收到下面的错误消息。

“CsvHelper.BadDataException:您可以通过将 BadDataFound 设置为 null 来忽略错误数据。”

当我删除日志的引用(杰克)时它将起作用。

那么问题来了,如何配置报价的设置呢?

请注意,日志中有一个不带引号的列。

CSV

Id,Name,Type
1, "Jake",User

映射

public LogProfile()
{
    Map(m => m.Id).Name("Id");
    Map(m => m.Name).Name("Name");
    Map(m => m.Type).Name("Type");
}

转换

const string headerPrefix = "Id,";
var path = @"D:\test.csv";
var readConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    ShouldQuote = x => x.Field.Contains("\"")
};
var input = new List<LogRecord>();
using (var reader = new StreamReader(path))
using (var csv = new CsvReader(reader, readConfiguration))
{
    csv.Context.RegisterClassMap<LogProfile>();
    var isHeader = true;
    while (csv.Read())
    {
        if (isHeader)
        {
            
            if(csv.Parser.RawRecord.Contains(headerPrefix))
            {
                csv.ReadHeader();
                isHeader = false;
            }
            continue;
        }
        input.Add(csv.GetRecord<LogRecord>());
    }
}
Logger.LogInformation($"Done {path}");

When the spec data has quote ("Jake"), I got an error message below.

"CsvHelper.BadDataException: You can ignore bad data by setting BadDataFound to null."

It will work when I remove log's quote (Jake).

So the question is how to config the setting about quote?

Notice the log has a col with no quote.

CSV

Id,Name,Type
1, "Jake",User

MAP

public LogProfile()
{
    Map(m => m.Id).Name("Id");
    Map(m => m.Name).Name("Name");
    Map(m => m.Type).Name("Type");
}

Convert

const string headerPrefix = "Id,";
var path = @"D:\test.csv";
var readConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    ShouldQuote = x => x.Field.Contains("\"")
};
var input = new List<LogRecord>();
using (var reader = new StreamReader(path))
using (var csv = new CsvReader(reader, readConfiguration))
{
    csv.Context.RegisterClassMap<LogProfile>();
    var isHeader = true;
    while (csv.Read())
    {
        if (isHeader)
        {
            
            if(csv.Parser.RawRecord.Contains(headerPrefix))
            {
                csv.ReadHeader();
                isHeader = false;
            }
            continue;
        }
        input.Add(csv.GetRecord<LogRecord>());
    }
}
Logger.LogInformation(
quot;Done {path}");

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

随波逐流 2025-01-21 09:35:25

尝试使用 TrimOptions.TrimConfiguration 设置。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        TrimOptions = TrimOptions.Trim
    };
    
    using (var reader = new StringReader("Id,Name,Type\n1, \"Jake\",User"))
    using (var csv = new CsvReader(reader, config))
    {
        var records = csv.GetRecords<LogRecord>();
    }
}

public class LogRecord
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}

Try it with the Configuration setting of TrimOptions.Trim.

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        TrimOptions = TrimOptions.Trim
    };
    
    using (var reader = new StringReader("Id,Name,Type\n1, \"Jake\",User"))
    using (var csv = new CsvReader(reader, config))
    {
        var records = csv.GetRecords<LogRecord>();
    }
}

public class LogRecord
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文