2012-01-10 47 views
2

我正在制作一个使用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中所示(如果看原始这将是所有逗号隔开)

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

第二种结构是,如果用户不希望使用本网站,因为他们不想这样做,不舒服等等。他们可以选择打开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[]; 
     } 



    } 

回答

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

+0

雅的第一种方式是我在想我到底在做它的组成方式,但我喜欢你的第二条路。记录如何填充?引擎参数用于什么? – chobo2 2012-01-10 17:03:09

+0

FileHelper引擎为你填充它们。 'CustomSelector'函数是FileHelpers引擎为每条记录调用的委托。它将使用当前记录填充'engine'和'record',然后它将使用您返回的Type来确定要使用Format1和Format2中的哪一个。 – shamp00 2012-01-10 17:27:04

+0

好的。我想一旦我开始实施它。它会更有意义。 – chobo2 2012-01-10 18:40:51

1

随着你需要提前了解的格式FileHelpers。

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