C# 具有FileHelper的多个CSV结构

C# 具有FileHelper的多个CSV结构,c#,csv,filehelpers,C#,Csv,Filehelpers,我正在制作一个使用csv文件的网站。这个文件有两种格式(将来可能会更多) 结构1 Header 1 Header 2 Header 3 Header 4 a b c d x x x x 结构2 Header 1 Header 4 a d x x 上面是它在excel中的显示方式(如果查看原始数据,它将全部以逗号分隔) 我之所以希望有两个结构,是因为我正在尝试利用第三方站点,用

我正在制作一个使用csv文件的网站。这个文件有两种格式(将来可能会更多)

结构1

Header 1 Header 2 Header 3 Header 4 
a          b      c       d
x          x      x       x
结构2

Header 1 Header 4
a          d
x          x
上面是它在excel中的显示方式(如果查看原始数据,它将全部以逗号分隔)

我之所以希望有两个结构,是因为我正在尝试利用第三方站点,用户可以从该站点导出数据。此网站将其导出为csv文件,第一行为标题。我只关心其中的两个标题,目前不需要重置(但您必须导出所有无法拾取和选择的列)

第二种结构是,如果用户不希望使用此网站,因为他们不想、不愿意这样做等等。他们可以选择打开excel,手动写入数据,然后将其保存为csv文件

所以对于手工操作的人,我想让它尽可能简单,就好像我没有使用头2和头4数据一样,为什么我要麻烦他们输入呢?但是,同时如果人们通过第一种方式导出数据,我不希望他们必须去将文件加载到excel up并删除2列

我将要求标题必须始终是完整的,并且是第一行。我唯一想到的是阅读第一行并查看标题的顺序。如果它有4个标题的确切顺序,然后呈现一种方式。如果按该顺序只有两个标题,则以另一种方式呈现

我知道它有能力做多个分隔符,并选择如何呈现它,但由于我在看标题,我不确定这是否是烤在或如果我需要以某种方式写它自己,然后告诉它该怎么做

有没有人知道我是否可以用FileHelper来做这件事

编辑 这就是我目前所拥有的

MultiRecordEngine engine = new MultiRecordEngine(typeof(Format2), typeof(Format1));
    engine.RecordSelector = new RecordTypeSelector(CustomSelector);

    using (TextReader textReader = new StreamReader(stream))
    {
        if (engine.RecordType == typeof(Format2))
        {
            var myArry = engine.ReadStream(textReader) as Format2[];

        }
        else if(engine.RecordType == typeof(Format1))
        {
            var myArry = engine.ReadStream(textReader) as Format1[];
        }



    }

使用FileHelpers,您需要提前了解格式


这意味着在使用FileHelpers解析文件之前,您必须检测(使用您描述的方法)文件的格式。

以下是一些建议的方法:

在创建引擎之前,读取文件的第一行(在FileHelpers之外),并确定正在使用的格式

if (firstLineOfFile.Contains("Header 2"))
    FileHelperEngine engine = new FileHelperEngine(typeof(Format1)); 
else
    FileHelperEngine engine = new FileHelperEngine(typeof(Format2)); 
或者,您可以使用

使用选择器方法,例如

Type CustomSelector(MultiRecordEngine engine, string record) 
{ 
    // count the separators to determine which format to return
    int separatorCount = record.Count(f => f == ',');
    if (separatorCount == 4) 
        return typeof(Format1); 
    else 
        return typeof(Format2); 
} 

(MultiRecordEngine将来可以处理更多的格式-它有一个带有
参数的构造函数)

是的,第一种方法是我认为我最终会这样做的方法,但我喜欢你的第二种方法。记录是如何填写的?引擎参数用于什么?FileHelper引擎会为您填充这些参数。
CustomSelector
函数是FileHelpers引擎为每条记录调用的委托。它将用自身填充
引擎
,用当前记录填充
记录
,然后它将使用您返回的
类型
来确定要使用的
格式1
格式2
中的哪一个。确定。我想一旦我开始实施它。这会更有意义。那么,我以后如何确定要使用什么对象呢?我是否必须为每个记录一个“as”并查看它是否可以强制转换到该对象?否,
CustomSelector
委托中的
record
参数是一个
字符串。它表示导入格式中的一行。您必须提供一些逻辑,根据行的内容确定要使用哪个FileHelpers类(在我提供的示例中,我建议计算逗号,但您可以使用任何适合的方法)。
CustomSelector
委托必须返回应用于行的FileHelpers类的
类型。这里的数字应该有帮助。
Type CustomSelector(MultiRecordEngine engine, string record) 
{ 
    // count the separators to determine which format to return
    int separatorCount = record.Count(f => f == ',');
    if (separatorCount == 4) 
        return typeof(Format1); 
    else 
        return typeof(Format2); 
}