【发布时间】:2015-03-13 18:26:03
【问题描述】:
我看到有几个相关问题的答案,但不完全是我需要的,所以我会问一个新问题。我有这个包含数千行商店库存数据的 CSV 文件,我想将这些数据导入 MS SQL Server 数据库并使用 SQL 来处理它们。导入 CSV 文件后,SQL 表将有三列包含 CSV 数据。问题是我需要将此 CSV 数据放入单独的行中以便对其进行更多分析。我想最终得到两个表:通过导入 CSV 文件创建的原始表,以及通过拆分 CSV 创建的表。下面是这两个表的示意图:
/Table1 (the original CSV file). First row is column names:
StoreID,Date,StoreName,City,State,Category1CSV,Category2CSV,Category3CSV
1051,2/16/2014,Easton,Columbus,OH,"Flour,Yeast,Baking Powder","Milk,Water,Oil","Cinnamon,Sugar"
1425,1/14/2014,Crocker Park,Westlake,OH,"Baking Powder,Yeast,Flour","Oil,Milk,Water","Rosemay,Cinnamon,Sugar"
/Table2 (after splitting the CSV column contents). First row is column names:
StoreID,Date,StoreName,City,State,ItemName,ItemRank,ItemCategory
1051,2/16/2014,Easton,Columbus,OH,Flour,1,1
1051,2/16/2014,Easton,Columbus,OH,Yeast,2,1
1051,2/16/2014,Easton,Columbus,OH,Baking Powder,3,1
1051,2/16/2014,Easton,Columbus,OH,Milk,4,2
1051,2/16/2014,Easton,Columbus,OH,Water,5,2
1051,2/16/2014,Easton,Columbus,OH,Oil,6,2
1051,2/16/2014,Easton,Columbus,OH,Cinnamon,7,3
1051,2/16/2014,Easton,Columbus,OH,Sugar,8,3
1425,1/14/2014,Crocker Park,Westlake,OH,Baking Powder,1,1
1425,1/14/2014,Crocker Park,Westlake,OH,Yeast,2,1
1425,1/14/2014,Crocker Park,Westlake,OH,Flour,3,1
1425,1/14/2014,Crocker Park,Westlake,OH,Oil,4,2
1425,1/14/2014,Crocker Park,Westlake,OH,Milk,5,2
1425,1/14/2014,Crocker Park,Westlake,OH,Water,6,2
1425,1/14/2014,Crocker Park,Westlake,OH,Rosemary,7,3
1425,1/14/2014,Crocker Park,Westlake,OH,Cinnamon,8,3
1425,1/14/2014,Crocker Park,Westlake,OH,Sugar,9,3
SQL 列数据类型有:
Table 1
StoreID - int
Date - date
StoreName - nvarchar(50)
City- nvarchar(50)
State- nvarchar(50)
Category1CSV - nvarchar(MAX)
Category2CSV - nvarchar(MAX)
Category3CSV - nvarchar(MAX)
Table2
StoreID - int
Date - date
StoreName - nvarchar(50)
City- nvarchar(50)
State - nvarchar(50)
ItemName - nvarchar(50)
ItemRank - tinyint
ItemCategory -tinyint
标记为 Category1CSV、Category2CSV 和 Category3CSV 内容的表 1 列映射到表 2 列:ItemName、ItemRank、ItemCategory,其中 ItemName 是项目(例如:Flour),ItemRank 是项目在 CSV 列表中的顺序,并且 ItemCategory 是 1,2 或 3,具体取决于数据来自 Category1CSV、Category2CSV 还是 Category3CSV。
最重要的方面(除了拆分 CSV 列)是保持 CSV 列中项目的顺序。例如,StroreID 1051 的 Category1CSV 内容为“Flour,Yeast,Baking Powder”。这些将映射到 ItemName、ItemRank 和 ItemCategory 列,这样 ItemName = Flour,它的 ItemRank = 1,并且 ItemCategory = 1。这将是表 2 中的第一行。第二行是 ItemName = Yeast,它是 ItemRank = 2,并且 ItemCategory = 1,依此类推,直到您最终得到类似于上面的表 2 的内容。此外,您会注意到 ItemRank 编号从 Category1CSV 列的内容开始,然后是 Category2CSV,最后是 Category3CSV。
在冗长的解释之后,是否有可能有一些 SQL 语句为我从表 1 创建表 2?如果是这样,那会是什么样子?我打算使用 MS SQL Server Express 2012。
或者...正如有人向我建议的那样,最好在 Excel 或 Python 脚本中使用一些 VBA(可能与 Notepad++ 结合使用?)来完成此操作,然后只导入最终数据?我不在乎,我只是不能继续手动编辑 CSV 文件,因为它非常乏味且耗时。
【问题讨论】:
-
您是否考虑过使用 Excel 的文本到列功能而不是 SQL? SQL 在解析字符串数据方面并不是最好的,编写一个过程来做到这一点非常麻烦......
-
我也倾向于在 Excel 中解析出来,然后将结果推送到 SQL。
-
@Phrancis - 文本到列给了我新的列,我需要新的行。我刚刚研究了一些VBA......它看起来真的很复杂。我需要根据“,”进行拆分,将其复制到新列,为每个 CSV 列执行此操作,然后我需要向下填充其他列,然后根据顺序为排名添加一个数字系列CSV 列表中的项目,最后告诉它是否来自名为 Category1CSV 的列,然后是 ItemCategory 的值 = 1,来自名为 Category2CSV 的列,然后是 ItemCategory = 2 的值。等等
-
如果我要在 Excel 中解决这个问题,I think this 可能是我的答案的一部分。
-
好吧,如果您必须使用 SQL,那么您可能需要查看something like this。公平的警告,但它不是很漂亮。