C# 使用CSVWriter强制执行字符串长度
我目前正在从事一个项目,将JSON数据从SaaS工具(通过API)拉入SQL数据库。最终,这些数据将用于报告目的(作为Tableau中的数据源) 以下是整个流程: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
RestSharp
)JSON.NET
+json2csharp
生成POCO类)列表中
CSVHelper
)我知道我可以在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个字符长