使用标题作为列名称将CSV文件与数据一起上载

时间:2015-04-09 06:01:41

标签: c# sql-server csv

我必须将csv文件数据上传到数据库中,其中行标题将是列名称,并且它们可能因CSV文件而异,但具有一些必需的标题。我想知道如何为这种要求设计数据库结构。我正在考虑动态创建列,但我怀疑如果下一个上传的文件没有相同的行标题。

请提供一些有关如何继续操作的提示。 Thaks

2 个答案:

答案 0 :(得分:1)

我认为你的问题,说实话,是建筑之一。让我总结一下我认为你所说的问题是什么。您的用户将上载包含数据的CSV文件,其中第一行是“列标题”或该数据的标签。您需要能够将数据存储在数据库中,而无需确定将调用哪些列标题。而且,为了进一步复杂化,下一个连续的CSV文件可能具有完全不同的列标题。

没有解决方案,这将适合整洁,易于打包的表结构。即使你有名为“用户定义1”,“用户定义2”等的列,要始终正确地将文件映射到这些字段将是非常困难和充满困难的。

相反,您应该探索三种备选方案:

1)将数据存储在非线性结构中。有两张桌子。一个将保存您知道永远不会改变的静态列,以及主键。第二个表与第一个表具有1对多的关系,第二个表中的每一行将表示与第一个表关联的新数据元素。行。

2)将数据存储在NoSQL数据库中。我自己并不是非常熟悉这些,但我的理解是它们是基于文档的,可以保存带有不同对象图的文档,并提供查询这些文档的机制。

3)如果您无法切换到NoSQL数据库,并假设您在SQL Server上,请将数据存储为XML。您可以利用SQL Server的内置XML解析函数来查询数据,但由于它只在一行中,因此您无需担心列标题映射。

最后要注意的是,在您提供的方案中,可能没有一种解决方案不会为性能提取一些成本。结构经常存在是有原因的,虽然这并不意味着我们可以放弃结构化数据,但这意味着我们必须接受这种成本。

答案 1 :(得分:0)

我完成了同样的事情。我们的要求是一个接受来自多家公司的数据转储的应用程序。数据必须包含少量已知列(尽管这些列的名称可能因公司而异),但其余的非强制列可能会有所不同。

我们选择了" primary"用于保存必需信息的表以及用于实体属性值(EAV)类型表的剩余列。我知道这种结构通常是不受欢迎的,但这是我们选择的解决方案,虽然并不完美,但它对我们来说还算不错。

我们基本上可以使用带有动态列的数据透视查询来重建数据。我承认,当表格变得庞大时,这种情况很慢,大多数需要的查询都是在" primary"表,并且只为感兴趣的记录提取属性,因此它对我们有用。

Here是我对此发表的另一篇文章。它提到了其他一些可能提供一些有用见解的SO帖子。