我计划为教育目的创建一个Fitbit数据仓库,而且似乎没有专门针对Fitbit数据的在线材料。
面临的一些问题:
您一次只能从Fitbit网站导出最多1个月的数据。我的计划是一次将一个月的数据放入一个文件夹中,并分别读取这些文件。
您可以通过CSV或.XLS导出数据。 XLS的问题在于,该月的每一天都会为食物日志创建单独的工作表,然后需要将其合并到暂存表中。 CSV的问题是每个文件只有一张纸,而所有数据都在其中:CSV Layout
然后我将使用SSIS将数据加载到SQL Server数据库中以进行报告。
哪种更适合的方法是使用.XLS格式或CSV导出数据?
编辑:如何将具有这种格式的CSV文件加载到SSIS中?
CSV布局如下:
、、、、、、、、、 日期,体重,体重指数,脂肪 01/06 / 2018,71.5,23.29,15 ,,,,,, 02/06 / 2018,71.5,23.29,15 ,,,,,, 03/06 / 2018,71.5,23.29,15 ,,,,,, 04/06 / 2018,71.5,23.29,15 ,,,,,, 05/06 / 2018,71.5,23.29,15 ,,,,,, 06/06 / 2018,71.5,23.29,15 ,,,,,, 07/06 / 2018,71.5,23.29,15 ,,,,,, 08/06 / 2018,71.5,23.29,15 ,,,,,, 09/06 / 2018,71.5,23.29,15 ,,,,,, 10/06 / 2018,71.5,23.29,15 ,,,,, 11/06 / 2018,71.5,23.29,15 ,,,,,, 12/06 / 2018,71.5,23.29,15 ,,,,,, 13/06 / 2018,71.5,23.29,15 ,,,,,, 14/06 / 2018,71.5,23.29,15 ,,,,, 15/06 / 2018,71.5,23.29,15 ,,,,, 16/06 / 2018,71.5,23.29,15 ,,,,, 17/06 / 2018,71.5,23.29,15 ,,,,, 18/06 / 2018,71.5,23.29,15 ,,,,, 19/06 / 2018,71.5,23.29,15 ,,,,,, 20/06 / 2018,71.5,23.29,15 ,,,,,, 21/06 / 2018,71.5,23.29,15 ,,,,,, 22/06 / 2018,71.5,23.29,15 ,,,,, 23/06 / 2018,71.5,23.29,15 ,,,,,, 24/06 / 2018,71.5,23.29,15 ,,,,, 25/06 / 2018,71.5,23.29,15 ,,,,, 26/06 / 2018,71.5,23.29,15 ,,,,,, 27/06 / 2018,71.5,23.29,15 ,,,,, 28/06 / 2018,71.5,23.29,15 ,,,,, 29/06 / 2018,72.8,23.72,15 ,,,,, 30/06 / 2018,72.95,23.77,15 ,,,,,, 、、、、、、、、
食物、、、、、、、 日期,卡路里,,,,,,,,, 01/06 / 2018,0 ,,,,,,,, 02/06 / 2018,0 ,,,,,,,, 03/06 / 2018,0 ,,,,,,,, 04/06 / 2018,0 ,,,,,,,, 05/06 / 2018,0 ,,,,,,,, 06/06 / 2018,0 ,,,,,,,, 07/06 / 2018,0 ,,,,,,,, 08/06 / 2018,0 ,,,,,,,, 09/06 / 2018,0 ,,,,,,,, 10/06 / 2018,0 ,,,,,,,, 11/06 / 2018,0 ,,,,,,,, 12/06 / 2018,0 ,,,,,,,, 13/06 / 2018,100 ,,,,,,,, 14/06 / 2018,0 ,,,,,,,, 15/06 / 2018,0 ,,,,,,,, 16/06 / 2018,0 ,,,,,,,, 17/06 / 2018,0 ,,,,,,,, 18/06 / 2018,0 ,,,,,,,, 19/06 / 2018,0 ,,,,,,,, 20/06 / 2018,0 ,,,,,,,, 21/06 / 2018,0 ,,,,,,,, 22/06 / 2018,0 ,,,,,,,, 23/06 / 2018,0 ,,,,,,,, 24/06 / 2018,0 ,,,,,,,, 25/06 / 2018,0 ,,,,,,,, 26/06 / 2018,0 ,,,,,,,, 27/06/2018,“ 1,644” ,,,,,,, 28/06/2018,“ 2,390” ,,,,,,, 29/06 / 2018,981 ,,,,,,,, 30/06 / 2018,0 ,,,,,,,
例如,“食物”将是表名,“日期”和“卡路里输入”将是列名。 “ 01/06/2018”是日期,“ 0”是“卡路里输入”,依此类推。
答案 0 :(得分:0)
棘手的是,我只是拉了我的fitbit数据,因为这激发了我的好奇心。那个csv很乱。基本上,您在一个文件中具有混合文件格式。在SSIS中,这不是直截了当的。 XLS格式,就像您在工作表上提到的每天记录的食物日志一样,SSIS不会喜欢这种更改。
我在CSV上看到的选项上方的一对。
从Fitbit单个导出
我看到您可以选择要包含在导出中的数据:身体,食物,活动,睡眠。
可以这样做,但是在必须从Fitbit导出数据时会很麻烦。
处理包含所有数据的一个文件
由于格式混合,并且各节的列定义不同,因此您必须发挥创意。
一个选择是创建一个登台表,其中的栏目与该节中最多的栏目一样多,看起来可能是“活动”。为每列指定一个通用名称,即Column1,Column2,并将它们全部设为VARCHAR。
由于我们混合使用了“格式”,并且并非所有数据类型都可以排列在一起,因此我们只需要首先取出所有数据,然后再整理转换即可。
您可以在此处构建一个数据流,平面文件源和also get line number added,因为我们需要整理出以后每个数据部分的位置。
在为源建立文件连接时,由于文件中的第一行数据并不包含每个字段的所有逗号,因此您将必须手动添加所有列。SSIS将无法检测到所有列。手动添加所需的列数,还请确保:
那应该使您至少将数据加载到数据库中到阶段表中。从那里开始,您将需要使用一堆T-SQL将数据的每个“部分”清零,然后从那里进行解析,转换和加载。
小测试,我刚进行过表调用TestTable:
CREATE TABLE [dbo].[TestTable](
[LineNumber] [INT] NULL,
[Column1] [VARCHAR](MAX) NULL,
[Column2] [VARCHAR](MAX) NULL,
[Column3] [VARCHAR](MAX) NULL,
[Column4] [VARCHAR](MAX) NULL,
[Column5] [VARCHAR](MAX) NULL,
[Column6] [VARCHAR](MAX) NULL,
[Column7] [VARCHAR](MAX) NULL,
[Column8] [VARCHAR](MAX) NULL,
[Column9] [VARCHAR](MAX) NULL
)
数据流并连接了文件源:
执行数据流,然后将数据加载为:
从那里我制定了一些T-SQL来获取数据的每个“部分”。这是一个示例,显示了如何过滤到“食物”部分:
DECLARE @MaxLine INT = (
SELECT MAX([LineNumber])
FROM [TestTable]
);
--Something like this, using a sub query that gets you starting and ending line numbers for each section.
--Doing the conversion of what column that section of data ended up in.
SELECT CONVERT(DATE, [a].[Column1]) AS [Date]
, CONVERT(BIGINT, [a].[Column2]) AS [CaloriesIn]
FROM [TestTable] [a]
INNER JOIN (
--Something like this to build out starting and ending line number for each section
SELECT [Column1]
, [LineNumber] + 2 AS [StartLineNumber] --We add 2 here as the line that start the data in a section is 2 after its "heading"
, LEAD([LineNumber], 1, @MaxLine) OVER ( ORDER BY [LineNumber] )
- 1 AS [EndLineNumber]
FROM [TestTable]
WHERE [Column1] IN ( 'Body', 'Foods', 'Activities' ) --Each of the sections of data
) AS [Section]
ON [a].[LineNumber]
BETWEEN [Section].[StartLineNumber] AND [Section].[EndLineNumber]
WHERE [Section].[Column1] = 'Foods'; --Then just filter on what sectoin you want.
又给了我以下内容:
解析该数据可能还有其他选项,但这应该为您提供一个很好的起点,并提供一个关于此特定CSV文件有多难处理的想法。
对于XLS选项,除食物原木之外的所有部分都可以直接使用。您基本上将建立一个excel文件连接,并且每个工作表在数据流中都是源中的“表”,并且每个工作表都有单独的数据流。
但是食物日志呢?一旦这些改变了,而您进入了下个月,或者SSIS突然崩溃了,就会出错,甚至可能抱怨元数据。
一种明显的解决方法是手动操作excel,然后将其全部合并到一个“ Food Log”表中,然后再通过SSIS运行它。不理想,因为您可能希望完全自动化。
我必须对此进行修补。也许是脚本任务和一些C#代码将所有这些工作表合并为一个,从每个工作表名称中解析日期,然后在数据流加载之前将日期附加到数据中。可能。
无论您使用哪种格式,Fitbit导出的两个文件似乎都存在挑战。