使用FileHelper的多个CSV结构

问题描述 投票:2回答:2

我正在制作一个使用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中显示(如果看原始它将以逗号分隔)

我想拥有2个结构的原因是因为我正在尝试利用用户可以从中导出数据的第三方网站。此站点将其导出为csv文件,第一行是标题。我真的只关心其中的两个标题并且当前不需要重置(但是你必须导出所有列都不能选择)。

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

因此,对于手动人员,我想让它尽可能简单,好像我没有使用Header 2和Header 4数据为什么我要打扰他们进入呢?然而,与此同时,如果人们通过第一种方式并导出数据,我不希望他们必须将文件加载到excel并删除2列。

我要求标题必须始终保持完整并且是第一行。我想出的唯一想法是读取第一行并查看标题的顺序。如果它按照确切的顺序有4个标题,则以单向渲染。如果该顺序中只有2个标题以另一种方式呈现它。

我知道FileHelpers有能力做多个分隔符并选择如何渲染它但是因为我正在查看标题我不确定这是否已经融入或者我是否需要以某种方式自己编写然后告诉它该做什么。

有没有人知道我是否可以用filehelpers做到这一点?

编辑这是我到目前为止

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[];
        }



    }
c# csv filehelpers
2个回答
5
投票

以下是一些建议的方法:

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

if (firstLineOfFile.Contains("Header 2"))
    FileHelperEngine engine = new FileHelperEngine(typeof(Format1)); 
else
    FileHelperEngine engine = new FileHelperEngine(typeof(Format2)); 

或者,您可以使用MultiRecordEngine

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

用选择器方法之类的东西

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将来可以处理更多格式 - 它有一个带有params参数的构造函数)


1
投票

使用FileHelpers,您需要提前知道格式。

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

© www.soinside.com 2019 - 2024. All rights reserved.