我正在制作一个使用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个结构的原因是因为我正在尝试利用用户可以从中导出数据的第三方网站。此站点将其导出为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[];
}
}
答案 0 :(得分: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 :(得分:1)
使用FileHelpers,您需要提前知道格式。
这意味着在使用FileHelpers解析文件之前,您必须检测(使用您描述的方法)文件格式。