gpt4 book ai didi

c# - 如何在使用 filehelpers 库导入 csv 文件时修复 ConvertException

转载 作者:行者123 更新时间:2023-11-30 17:18:46 25 4
gpt4 key购买 nike

我正在处理一个 csv 文件,由于用户输入错误,该文件偶尔会在 int 字段中包含文本。它是第一列,基本上它应该是一个唯一的记录 ID。我正在使用 engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 捕获错误

我宁愿做的是忽略错误并将文本替换为我选择的数值,并且该行仍包含在处理结果中。

我什至可以接受这个过程,只要坚持我在文件定义类文件中声明的默认值:[FieldNullValue(typeof(int), "0")]

另一件事是我正在确定在运行时要解析的文件,如下所示:

Type t = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className);  

FileHelperEngine engine = new FileHelperEngine(t);

所以我不确定如何在为 <CustomersFixedWithNumericId> 添加内容的背景下实现 D.Lambert 的建议因此,澄清一下,有 7 种不同的文件定义(类文件)被上传/处理,但它们都有 CustomerId 字段。

最佳答案

鉴于 FileHelpers 的当前状态,您确实必须将该字段定义为字符串并尝试对其进行自己的验证。

我研究了几种不同的方法来解决这个问题——首先,我尝试使用属性而不是字段来设置记录。可以想象,这可能允许您创建一个 String 属性并验证 Set 上的输入。事实证明这很困难,因为:

  • 属性仅设置为目标字段(如果您想修改 FileHelpers 代码,这很容易解决。
  • 必须使用 [FieldNotInFile] 属性标记属性的私有(private)字段(烦人)。
  • 属性不在 RecordInfo.CreateCoreFields() 方法中处理。这个修复起来有点复杂,因为您确实必须以正确的顺序创建属性和字段的合并列表。这就是我停止研究这种方法的原因。

下一步计划:按原样使用记录定义,并在读取期间进行验证。在引擎上设置事件处理程序:

    engine.AfterReadRecord += new Events.AfterReadHandler<CustomersFixedWithNumericId>(engine_AfterReadRecord);
var res = engine.ReadFile(path);

然后在处理程序中处理错误值:

    void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<CustomersFixedWithNumericId> e)
{
int intVal;
int.TryParse(e.Record.CustomerID, out intVal);
e.Record.CustomerID = intVal.ToString();
}

这两个都不完美,但我认为第二个相当接近。

附录:这显示了上面的技术和一个后期绑定(bind)类:

public void TestMethod1()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
Type t = assembly.GetType("FileHelpers.Tests.CustomersFixedWithNumericId");
FileHelperEngine engine = new FileHelperEngine(t);

string path = @"pathtofile\BadCustomersFixedNumericId.txt";

engine.AfterReadRecord += new Events.AfterReadHandler<object>(engine_AfterReadRecord);
var res = engine.ReadFile(path);
}

void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<object> e)
{
// validation here
}

关于c# - 如何在使用 filehelpers 库导入 csv 文件时修复 ConvertException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5444701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com