- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我看到有几个相关的问题和答案,但不完全是我需要的,所以我会问一个新问题。我有这个包含数千行商店库存数据的 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 是项目(例如:面粉),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 文件,因为它非常乏味且耗时。
最佳答案
我会使用 Split 函数来拆分附加值。
我使用的 Split 函数使用一个 Numbers(一个包含数字 1 到 1,000,000 的表格)以促进拆分过程。
一旦 Numbers 表和 Split 函数就位,我将使用 CROSS APPLY 函数将 Split 应用于 CSV 列。拆分 CSV 列的代码如下所示(这只是基于您提供的数据的几个测试行)。
DECLARE @Table TABLE (val1 VARCHAR(50), val2 VARCHAR(50), val3 VARCHAR(50), csv1 VARCHAR(100), csv2 VARCHAR(100), csv3 VARCHAR(100))
INSERT INTO @Table
VALUES ('Easton', 'Columbus', 'OH', 'Flour,Yeast,Baking Powder','Milk,Water,Oil','Cinnamon,Sugar')
, ('Crocker Park', 'Westlake', 'OH', 'Baking Powder,Yeast,Flour','Oil,Milk,Water','Rosemary,Cinnamon,Sugar')
SELECT tbl.val1, val2, val3, apl.*
FROM @Table tbl
CROSS APPLY(
SELECT val
FROM dbo.Split(tbl.csv1, ',')
) apl
UNION ALL
SELECT tbl.val1, val2, val3, apl.*
FROM @Table tbl
CROSS APPLY(
SELECT val
FROM dbo.Split(tbl.csv2, ',')
) apl
UNION ALL
SELECT tbl.val1, val2, val3, apl.*
FROM @Table tbl
CROSS APPLY(
SELECT val
FROM dbo.Split(tbl.csv3, ',')
) apl
ORDER BY val1
根据样本日期,其输出将如下所示。
Crocker Park Westlake OH Baking Powder
Crocker Park Westlake OH Cinnamon
Crocker Park Westlake OH Flour
Crocker Park Westlake OH Milk
Crocker Park Westlake OH Oil
Crocker Park Westlake OH Rosemary
Crocker Park Westlake OH Sugar
Crocker Park Westlake OH Water
Crocker Park Westlake OH Yeast
Easton Columbus OH Baking Powder
Easton Columbus OH Cinnamon
Easton Columbus OH Flour
Easton Columbus OH Milk
Easton Columbus OH Oil
Easton Columbus OH Sugar
Easton Columbus OH Water
Easton Columbus OH Yeast
下面是创建 Numbers 表的代码
DECLARE @tbl TABLE (n INT)
INSERT INTO @tbl (n)
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
; WITH Num AS(
SELECT one.n
FROM @tbl one
CROSS JOIN @tbl two
CROSS JOIN @tbl three
CROSS JOIN @tbl four
CROSS JOIN @tbl five
CROSS JOIN @tbl six
)
SELECT ROW_NUMBER() OVER(ORDER BY n) AS n
INTO dbo.Numbers
FROM Num
ALTER TABLE dbo.Numbers
ALTER COLUMN n INT NOT NULL
ALTER TABLE dbo.Numbers
ADD PRIMARY KEY (n)
GO
最后,这里是创建 Split 函数的代码。
CREATE FUNCTION dbo.Split
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
RETURN
(
SELECT val = SUBSTRING(@List, n, CHARINDEX(@Delimiter, @List + @Delimiter, n) - n)
FROM dbo.Numbers
WHERE n <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, n, LEN(@Delimiter)) = @Delimiter
);
GO
关于python - 我可以使用 SQL 将存储为 CSV(逗号分隔值)的表列的内容拆分为新表中的各个行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29039410/
我正在尝试从下拉列表中创建一个多选复选框,并通过 ; 连接所选结果。 我的代码是这样的: var myobject = { ValueA : 'Text A', ValueB : 'T
我有输入,我需要获取值并用 “|” 符号分隔。 我的输入: 输出我需要的: 00:00|00:00|00:00 我的代码是: (而且它不工作) var timesArray = $('table').
我正在尝试将超过 400 万行的列拆分为 4 个新列,问题是我不知道在哪里查看或我应该使用 Google 搜索哪个术语。 (是的,我已经在 Google 和 Stack 中搜索了一个类似的问题,但只在
我有一个很大的 csv 文件,其中充满了用“|”分隔的数字字符,例如: 432452 | 543634 4122442 | 41256512 64523 | 12416 然后我读入数据如下: fs
我有一个程序可以计算多个数字的阶乘。这些数字在 cmd 中作为参数传递: factorial.exe 3 4 5 这将分别计算 3、4 和 5 的阶乘。该程序的早期版本有一个百分比显示堆栈的完整性。我
这个问题已经有答案了: 奥 git _a (6 个回答) 已关闭 9 年前。 我有一个双数“547.123456” 我只想使用这个 double 作为“547.1”,就像“.”后面只有 1 个数字 我
我有一个程序可以计算多个数字的阶乘。这些数字在 cmd 中作为参数传递: factorial.exe 3 4 5 这将分别计算 3、4 和 5 的阶乘。该程序的早期版本有一个百分比显示堆栈的完整性。我
我有一个 ArrayList,其中包含一个 messageId、一个 -、一个用户名。 示例:E123-sam 我想划分 List 的每个元素,使得 - 之前的部分进入一个 ArrayList ,而之
我目前有一个“日期”列作为 pandas 数据框的索引,其格式为: January February .... Year2 January February ... Year3 (它来自 pdf 表格
我正在尝试对我的 .mdb 数据库进行 ODBC 查询。我正在使用 mdbtools 驱动程序。该代码是使用 Eclipse 用 C 语言编写的。唯一的问题是,当我写例如: "SELECT 'last
我需要知道如何将这两个if else 部分分开。 public static int NextBday(int Bdays, int days){ int daysleft = 0;
我想计算我的员工分开但合并在一起的出勤率 My target output 我的代码 SELECT count(employees_id) as numbers FROM attendance WH
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
下面是我的代码的一小段摘录,它从 API 添加了一行。总共有很多行。 每一行包含一行数据如 TY8tr,50,34,P,SB, 数据行在数据类型上是一致的。我如何通过 ,'s 拆分数组列表中
我想获取选中的元素并用逗号分隔它们,最后一个元素用“and”分隔 它的显示输出为: 我想删除最后一个元素后面的逗号 (,) 并在它前面添加 'and',例如 Sugar, Milk and Extra
我是 JSON 的新手,但在从已解析的 JSON 对象中提取数据时遇到问题: 我有一个 getstats.php 文件,它回显 mysql 查询的 json 编码结果。以下是 php 文件返回的示例:
我有一个像这样的数字/字符串(我不确定如何将 int 与字符串相互转换) 000000122310200000223340000700012220000011411000000011011271043
标签内的文本
我想尝试一些基本的网络抓取,但遇到了一个问题,因为我习惯了简单的 td-tags,在这种情况下,我有一个网页,其中包含以下预标记和其中的所有文本,这意味着刮掉它有点棘手。 11111111 1111
出于练习目的,我正在开发 TCP 客户端/服务器系统,我想在两者之间发送特定数据。 我已经能够发送字节并让它们显示为字符串。此外,我还可以发送一个特定的字符串(“mb”)并在服务器端弹出一个 Mess
在大量的 unicode 字符中,有一些实际上表示多个字符,例如两个 'f' 字符的 U+FB00 连字 ff。有什么方法可以轻松地将这样的字符转换为多个单个字符?最好是标准 Java API 中可用
我是一名优秀的程序员,十分优秀!