在C中,Salesforce是否可以报告;CSV";是否反序列化为C#对象?

在C中,Salesforce是否可以报告;CSV";是否反序列化为C#对象?,c#,csv,object,salesforce,deserialization,C#,Csv,Object,Salesforce,Deserialization,我们将通过REST/POST端点接收“CSV”格式的Salesforce报告,该报告将被捕获为IFormFile的一个实例,我们可以使用file.OpenReadStream()将其转换为流 虽然据称是逗号分隔的,但实际上它们是分号分隔的,为了进一步减少歧义的风险,所有值都用引号括起来。不仅如此,标题是为了便于人们阅读,因此与变量名不同,它们包含空格 典型的文件可能如下所示: "Opportunity Name";"Order Number";"

我们将通过REST/POST端点接收“CSV”格式的Salesforce报告,该报告将被捕获为
IFormFile
的一个实例,我们可以使用
file.OpenReadStream()
将其转换为流

虽然据称是逗号分隔的,但实际上它们是分号分隔的,为了进一步减少歧义的风险,所有值都用引号括起来。不仅如此,标题是为了便于人们阅读,因此与变量名不同,它们包含空格

典型的文件可能如下所示:

"Opportunity Name";"Order Number";"Date of request for deed registry check";"Date of deed registry evaluation"
"Implementation - Jayde Cote";"20190605_Cote_11";"";"09.11.2020"
"Implementation - Ebony Collier";"20190612_Collier_48";"09.10.2020";"09.11.2020"
"Implementation - Izzy Bains";"20190528_Bains_42";"09.11.2020";""
我想将其反序列化到一个列表中,其中Opportunity是一个类,如:

public class Opportunity {
    public string OpportunityName {get; set;}
    public string OrderNumber {get; set;}
    public DateTime RequestDate {get; set;}
    public DateTime EvaluationDate {get; set;}
}
是的,我知道我可以为此构建一个解析器,但是反序列化会更加优雅。
这可能吗?如果是,如何使用?

例如,您可以使用许多库中的一个。 设置非常简单,有几个选项可以声明您的需求(“作为引号字符、、分隔符)。我意识到您使用的格式与RFC4180非常相似,所以…:

var options = new Options('"', '\\', ';');
var tokenizer = new RFC4180Tokenizer(options);      
CsvParserOptions csvParserOptions = new CsvParserOptions(true, tokenizer);      
CsvReaderOptions   csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
然后您需要一个映射声明,在您的例子中,类似这样的东西,虽然您也可以使用一个类型转换器,比如一个新的DateTimeConverter(“dd.MM.yyyy”),但在您的例子中是不必要的:

private sealed class CsvOpportunityMap : CsvMapping<Opportunity>
{
    public CsvOpportunityMap() : base()
    {
        MapProperty(0, m => m.OpportunityName );
        MapProperty(1, m => m.OrderNumber );
        MapProperty(2,  m => m.RequestDate);
        MapProperty(3,  m => m.EvaluationDate);
    }
}
私有密封类CsvOpportunityMap:CsvMapping
{
public CsvOpportunityMap():base()
{
MapProperty(0,m=>m.OpportunityName);
MapProperty(1,m=>m.OrderNumber);
MapProperty(2,m=>m.RequestDate);
MapProperty(3,m=>m.EvaluationDate);
}
}
我已经用您的场景构建了一个示例,我不喜欢TinyCsvParser构建属性映射的方式,但我认为它在性能和内存占用大小方面都很好


有第三方库(如CSVHelper)它将从CSV中生成对象和
IEnumerable
,并以您提议的反序列化程序的优雅和优雅来完成。为将这项工作放入其中而干杯。如果我需要解析,这似乎是一个很好的方法……但我希望找到一种使用ServiceStack.Text.CsvSerializer或类似的方法来完成所有工作和任务不必担心列被移动。类似这样:…但可以使用我的CSV。