- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CsvHelper v26.1.0 读取以下由 ~
分隔的文本文件:
123~John
234~Joe "Public"
但文件中的双引号导致 CsvHelper 将它们视为错误数据。我通过删除双引号对其进行了测试,并且效果很好。但问题是,我已经设置了自定义分隔符,为什么双引号仍然导致问题?
public class AccountDtoMap : ClassMap<AccountDto>
{
public AccountDtoMap()
{
Map(m => m.Number).Index(0);
Map(m => m.Name).Index(1);
}
}
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = "~",
HasHeaderRecord = false,
MissingFieldFound = (context) => { errs.Add($"{typeof(T)} missing field: {context.Context.Parser.RawRecord}"); },
BadDataFound = (context) => { errs.Add($"{typeof(T)} bad data: {context.RawRecord}"); },
};
using (var csv = new CsvReader(new StreamReader(file), cfg))
{
csv.Context.RegisterClassMap<AccountDtoMap>();
return csv.GetRecords<T>().ToList();
}
可运行演示 here .
最佳答案
要解析问题中显示的 CSV(版本 26.1.0),您需要正确配置以下所有 CsvConfiguration
设置,而不仅仅是分隔符:
上面前三个字符设置的功能在CsvMode
enum的注释中有说明。 :
public enum CsvMode
{
/// Uses RFC 4180 format (default).
/// If a field contains a CsvConfiguration.Delimiter or CsvConfiguration.NewLine,
/// it is wrapped in CsvConfiguration.Quote's.
/// If quoted field contains a CsvConfiguration.Quote, it is preceded by CsvConfiguration.Escape.
RFC4180 = 0,
/// Uses escapes.
/// If a field contains a CsvConfiguration.Delimiter, CsvConfiguration.NewLine,
/// or CsvConfiguration.Escape, it is preceded by CsvConfiguration.Escape.
/// Newline defaults to \n.
Escape,
/// <summary>
/// Doesn't use quotes or escapes.
/// This will ignore quoting and escape characters. This means a field cannot contain a
/// CsvConfiguration.Delimiter, CsvConfiguration.Quote, or
/// CsvConfiguration.NewLine, as they cannot be escaped.
NoEscape
}
字段 Joe "Public"
包含本身未转义的嵌入转义字符,这导致 CshHelper 报告错误。为了避免错误,您有几种可能的选择,包括:
设置 CsvMode.NoEscape
以完全禁用转义和引用:
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Mode = CsvMode.NoEscape,
// Remainder unchanged.
当然,如果您这样做,您的 CSV 文件不能包含字段中嵌入的分隔符或换行符。
演示 fiddle #1 here .
设置 Mode = CsvMode.Escape
以禁用引号中的字段换行,并将 Escape
设置为其他字符,例如 \
或 \t
是您在实践中不希望在文件中遇到的:
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Mode = CsvMode.Escape,
Escape = '\\',
// Remainder unchanged.
即使您这样做,CSV 字段中的定界符、转义符和换行符仍必须使用选定的转义符正确转义。
演示 fiddle #2 here .
设置 Mode = CsvMode.Escape
并修复您的文件以正确转义转义字符:
234~Joe ""Public""
演示 fiddle #3 here .
关于c# - 自定义分隔符在 CsvHelper 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66824728/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!