C# 使用CSVWriter强制执行字符串长度

C# 使用CSVWriter强制执行字符串长度,c#,.net-core,etl,csvhelper,C#,.net Core,Etl,Csvhelper,我目前正在从事一个项目,将JSON数据从SaaS工具(通过API)拉入SQL数据库。最终,这些数据将用于报告目的(作为Tableau中的数据源) 以下是整个流程: 提取原始JSON数据(使用RestSharp) 将每条记录转换为POCO(使用JSON.NET+json2csharp生成POCO类) 将步骤2中的每条记录添加到列表中 将所有记录写入CSV文件(使用CSVHelper) 将CSV文件导入SQL数据库 注意:对每个对象重复这些步骤。大约有10个对象,每个对象的字段(列)介于10到150

我目前正在从事一个项目,将JSON数据从SaaS工具(通过API)拉入SQL数据库。最终,这些数据将用于报告目的(作为Tableau中的数据源)

以下是整个流程:

  • 提取原始JSON数据(使用
    RestSharp
  • 将每条记录转换为POCO(使用
    JSON.NET
    +
    json2csharp
    生成POCO类)
  • 将步骤2中的每条记录添加到
    列表中
  • 将所有记录写入CSV文件(使用
    CSVHelper
  • 将CSV文件导入SQL数据库
  • 注意:对每个对象重复这些步骤。大约有10个对象,每个对象的字段(列)介于10到150之间。所有POCO属性都是字符串(这不好吗?)

    问题:我收到截断错误,因为我不确定在每个列上定义/强制执行大小限制的最佳方法。有些列是自由文本段落字段,因此每列的“最大大小”可能会更改,从而导致截断错误。web API方面没有任何文档可以保证/定义数据的特定模式

    在第5步之前,如何为每列定义schema/max length,以避免出现截断错误


    我知道我可以在POCO定义中定义每个字段的最大长度:但我有10个POCO和数百个字段。最好的方法是什么?

    一种方法是查询数据库以查找文本列的最大长度。下面使用Dapper查询SQL Server数据库,但您应该能够修改该示例以与其他ORM或数据库提供程序一起使用。如果文本长度超过属性的最大长度,此示例将引发异常,但您可以修改它以截断字符串

    公共类程序
    {
    公共静态void Main(字符串[]args)
    {
    var connection=“数据源=ServerName;初始目录=MyDatabase;集成安全性=true”;
    var sql=@”
    挑选
    列名称作为列名称,
    字符最大长度作为字符最大长度
    从…起
    信息\u SCHEMA.COLUMNS
    哪里
    TABLE_NAME=@TableName和字符_最大长度不为空”;
    列出最大长度;
    使用(var db=new-SqlConnection(连接))
    {
    MaxLength=db.Query(sql,new{TableName=“MyClassExample”}).AsList();
    }
    var记录=新列表
    {
    新的MyClassExample{Id=1,PropertyName=“First”},
    new MyClassExample{Id=2,PropertyName=“Second肯定比50个字符的最大长度长。”}
    };
    使用(var csv=new CsvWriter(Console.Out))
    {
    var classMap=newdefaultclassmap();
    classMap.AutoMap();
    注册表最大长度(MaxLength);
    csv.Configuration.RegisterClassMap(类映射);
    csv.书面记录(记录);
    }
    Console.ReadLine();
    }
    }
    公共类MyClassExample
    {
    公共int Id{get;set;}
    公共字符串PropertyName{get;set;}
    }
    公共类MaxLengthConverter:StringConverter
    {
    私有只读int_maxLength=0;
    公共MaxLengthConverter(int maxLength)
    {
    _maxLength=maxLength;
    }
    公共重写字符串ConvertToString(对象值,IWriterRow行,MemberMapData MemberMapData)
    {
    if(值为字符串文本)
    如果(text.Length>\u maxLength)
    {
    var message=$“长度为{text.length}的文本超过了允许的最大长度{u maxLength}。\r\n”+
    $“Text:'{Text}'\r\n”+
    $“属性:{memberMapData.Member?.Name}\r\n”+
    $“TypeConverter:“{memberMapData.TypeConverter?.GetType().FullName}”;
    抛出新的TypeConverterException(this,memberMapData,value,row.Context,message);
    }
    返回base.ConvertToString(值、行、memberMapData);
    }
    }
    公共类最大长度
    {
    公共字符串ColumnName{get;set;}
    公共int字符最大长度{get;set;}
    }
    公共静态类CsvHelpExtensions
    {
    公共静态无效寄存器MaxLength(此类映射,IEnumerable MaxLength)
    {
    foreach(typeof(T).GetProperties()中的var属性)
    {
    var maxLength=maxLength.Where(m=>m.ColumnName.ToLower()==property.Name.ToLower()).FirstOrDefault();
    if(maxLength!=null)
    map.map(typeof(T),属性,true).TypeConverter(新的MaxLengthConverter(maxLength.CharacterMaximumLength));
    }
    }
    }
    
    一种方法是查询数据库以查找文本列的最大长度。下面使用Dapper查询SQL Server数据库,但您应该能够修改该示例以与其他ORM或数据库提供程序一起使用。如果文本长度超过属性的最大长度,此示例将引发异常,但您可以修改它以截断字符串

    公共类程序
    {
    公共静态void Main(字符串[]args)
    {
    var connection=“数据源=ServerName;初始目录=MyDatabase;集成安全性=true”;
    var sql=@”
    挑选
    列名称作为列名称,
    字符最大长度作为字符最大长度
    从…起
    信息\u SCHEMA.COLUMNS
    哪里
    TABLE_NAME=@TableName和字符_最大长度不为空”;
    列出最大长度;
    使用(var db=new-SqlConnection(连接))
    {
    MaxLength=db.Query(sql,new{TableName=“MyClassExample”}).AsList();
    }
    var记录=新列表
    {
    新的MyClassExample{Id=1,PropertyName=“First”},
    new MyClassExample{Id=2,PropertyName=“Second肯定比50个字符长