2

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

结构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 个结构的原因是因为我正在尝试利用用户可以从中导出数据的 3rd 方站点。该站点将其导出为 csv 文件,第一行是标题。我真的只关心 2 个标题,目前不需要重置(但您必须导出所有无法选择的列)。

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

因此,对于手动操作的人,我想让它尽可能简单,就好像我不使用 Header 2 和 Header 4 数据一样,我为什么要费心让他们输入呢?然而,与此同时,如果人们通过第一种方式并导出数据,我不希望他们不得不将文件加载到 excel 中并删除 2 列。

我将要求标题必须始终完好无损并且是第一行。我想出的唯一想法是阅读第一行并查看标题的顺序。如果它有 4 个按确切顺序排列的标头,则以一种方式呈现。如果该顺序中只有 2 个标题以另一种方式呈现。

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



    }
4

2 回答 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参数的构造函数)

于 2012-01-10T09:51:44.647 回答
1

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

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

于 2012-01-10T00:29:14.180 回答