csvhelper - 有没有办法忽略或全局替换 CSVHelper 中的 NUL 字符?
问题描述
几年来我们一直在使用 CSVHelper 来读取文件,它非常棒。最近,我们从试图上传他们的文件的客户那里收到了几个错误——他们发现他们的文件中有 NUL(即 ASCII 零)字符。
例如,假设我们在输入文件中有以下内容 - 其中 NUL 实际上是 ASCII 0...
这个,那个,NUL,TheOther
CSVHelper 很好地读取了这一行 - 并将 NUL 值转换为 .NET 空值(即“\0”)。如果可能,我们希望改变这种行为,并让 CSVHelper 将任何 NUL 实例替换为 string.Empty。
我们已经考虑过一次读取整个文件并自己替换所有 NUL 字符,但如果有一种优雅的方式来执行此操作,则宁愿使用 CSVHelper 执行此操作。我可以更改我们所有的类映射并覆盖框中的所有类型转换器来执行此操作,但如果有更通用的解决方案,我宁愿使用它。
我查看了 CsvConfiguration.InjectionCharacters 属性和 SanitizeForInjection 可能会解决问题,但这看起来只是在字段的前面添加了一个转义字符。
任何建议都非常感谢,在此先感谢!
解决方案
听起来你想用 CsvHelper 读取文件,用 string.Empty 替换 NUL 值,然后再次写回文件?如果是这样,我相信它可以使用自定义字符串转换器将记录作为动态列表读取以替换值,然后将它们再次写回文件。
public class Program
{
public static void Main(string[] args)
{
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
writer.WriteLine("Property1,Property2,Property3,Property4");
writer.WriteLine("This,That,\0,TheOther");
writer.Flush();
stream.Position = 0;
csv.Configuration.TypeConverterCache.AddConverter<string>(new NulStringConverter());
var records = csv.GetRecords<dynamic>().ToList();
using(var csvWriter = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
csvWriter.WriteRecords(records);
}
}
Console.ReadKey();
}
}
public class NulStringConverter : StringConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if (text == "\0")
{
text = string.Empty;
}
return base.ConvertFromString(text, row, memberMapData);
}
}
推荐阅读
- sql - 在 Oracle 中定义而不是触发器后无法更新复杂视图。ORA-01779: 无法修改映射到非键保留表的列
- google-maps - react-native-maps:apk构建后的灰色地图
- netsuite - 有什么方法可以使用 SuiteScript 将超过 10mb 的已保存搜索文件导入文件柜?
- c++ - 从列表中删除指针的正确方法是什么(使用 Qt)
- python - 熊猫替换行和列子集的空值
- python-3.5 - Django2.0 SMTPRecipientsRefused (550, b'无效的身份验证(你只能从@yourdomain.xy 或其别名发送)')
- model-view-controller - 如何在输入类型=时间的情况下使用 Html.TextBoxFor
- forms - 创建泛型 Form 函数时不重复参数的扩展
- nuxt.js - 我应该如何安装和添加 babel 插件和预设到 Nuxt?
- sql - SQL 月中