Fitbit数据导出-创建数据仓库

时间:2018-10-22 14:24:03

标签: sql-server ssis data-warehouse fitbit

我计划为教育目的创建一个Fitbit数据仓库,而且似乎没有专门针对Fitbit数据的在线材料。

面临的一些问题:

  1. 您一次只能从Fitbit网站导出最多1个月的数据。我的计划是一次将一个月的数据放入一个文件夹中,并分别读取这些文件。

  2. 您可以通过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”是“卡路里输入”,依此类推。

1 个答案:

答案 0 :(得分:0)

棘手的是,我只是拉了我的fitbit数据,因为这激发了我的好奇心。那个csv很乱。基本上,您在一个文件中具有混合文件格式。在SSIS中,这不是直截了当的。 XLS格式,就像您在工作表上提到的每天记录的食物日志一样,SSIS不会喜欢这种更改。

CSV: enter image description here XLS: enter image description here

我在CSV上看到的选项上方的一对。

从Fitbit单个导出

我看到您可以选择要包含在导出中的数据:身体,食物,活动,睡眠。

  1. 分别导出每个文件,并使用数据类型的前缀保存每个文件。
  2. 然后为每个单独的文件格式构建具有多个foreach循环和数据流任务的SSIS。

可以这样做,但是在必须从Fitbit导出数据时会很麻烦。

处理包含所有数据的一个文件

由于格式混合,并且各节的列定义不同,因此您必须发挥创意。

一个选择是创建一个登台表,其中的栏目与该节中最多的栏目一样多,看起来可能是“活动”。为每列指定一个通用名称,即Column1,Column2,并将它们全部设为VARCHAR。

由于我们混合使用了“格式”,并且并非所有数据类型都可以排列在一起,因此我们只需要首先取出所有数据,然后再整理转换即可。

您可以在此处构建一个数据流,平面文件源和also get line number added,因为我们需要整理出以后每个数据部分的位置。

在为源建立文件连接时,由于文件中的第一行数据并不包含每个字段的所有逗号,因此您将必须手动添加所有列。SSIS将无法检测到所有列。手动添加所需的列数,还请确保:

  • 文本限定符=“
  • 标题行分隔符= {LF}
  • 行定界符= {LF}
  • 列分隔符=,

那应该使您至少将数据加载到数据库中到阶段表中。从那里开始,您将需要使用一堆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
)

数据流并连接了文件源:

enter image description here

enter image description here

执行数据流,然后将数据加载为:

enter image description here

从那里我制定了一些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.

又给了我以下内容:

enter image description here

解析该数据可能还有其他选项,但这应该为您提供一个很好的起点,并提供一个关于此特定CSV文件有多难处理的想法。

对于XLS选项,除食物原木之外的所有部分都可以直接使用。您基本上将建立一个excel文件连接,并且每个工作表在数据流中都是源中的“表”,并且每个工作表都有单独的数据流。

enter image description here

但是食物日志呢?一旦这些改变了,而您进入了下个月,或者SSIS突然崩溃了,就会出错,甚至可能抱怨元数据。

一种明显的解决方法是手动操作excel,然后将其全部合并到一个“ Food Log”表中,然后再通过SSIS运行它。不理想,因为您可能希望完全自动化。

我必须对此进行修补。也许是脚本任务和一些C#代码将所有这些工作表合并为一个,从每个工作表名称中解析日期,然后在数据流加载之前将日期附加到数据中。可能。

无论您使用哪种格式,Fitbit导出的两个文件似乎都存在挑战。