【问题标题】:Loading Multiple CSV files into Multiple tables in MSSQL将多个 CSV 文件加载到 MSSQL 中的多个表中
【发布时间】:2018-06-23 09:44:05
【问题描述】:

我有 .CSV 格式的股票数据(总共 500 个 CSV)。我的目标是创建一个数据库,其中包含多个名为“A”、“B”的表,其中 A 和 B 指的是两种不同的股票。 我已经在数据库中加载了一个表,其中包含一个包含所有 500 个符号的列。

我想遍历每一行,以便我可以读取 CSV 并在我的数据库中为该股票创建一个表。例如,如果符号表中的第一行是“A”,那么我想通过读取名为“/path/A.csv”的 csv 文件在我的数据库中创建一个名为 A 的表

所有表的结构都相同。有“日期”、“开盘”、“高”、“低”、“收盘”、“成交量”四列

我为一只股票创建了一个表格。例如,在股票 A 的情况下,使用以下代码

create table A(
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL
  )
  BULK INSERT A
    FROM 'D:\ASX\A.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row

    TABLOCK
    )

由于我无法手动将名称从 A 更改为 B 和 C 直到它达到 500,因此我想知道如何从我的符号表中迭代 500 行,以便对于每次迭代,我上面的代码从 A 更改为B 到 C 等等。

【问题讨论】:

  • 您有符号列表还是仅来自目录中的文件?似乎最好添加一个符号列并将所有文件导入一个表中。该单一实体更适合关系数据库。
  • 我有另一个名为 symbols 的表,其中包含一个名为 Ticker 的单列,有 500 行,其中每一行都是一个 Ticker。例如,第一行将命名为“A”。
  • 没有。不要为每个股票创建一个表。使用包含股票代码的附加列创建一个表
  • 我对每只股票都有单独的 CSV,所以即使我创建了一个包含额外股票代码列的数据表,我也需要在读取 CSV 时运行一个循环。我该怎么做?
  • @f_hashim,我在答案中添加了规范化表设计的示例。

标签: sql-server database csv


【解决方案1】:

以下是使用现有设计为符号表中的每个股票代码创建和导入数据的一种方法。

DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);

SET @SQL = (SELECT N'
CREATE TABLE dbo.' + QUOTENAME(ticker) + N'(
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL
  );
BULK INSERT ' + QUOTENAME(ticker) + N'
    FROM ''' + @Path + N'\' + ticker + N'.csv''
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = '','',  --CSV field delimiter
    ROWTERMINATOR = ''\n'',   --Use to shift the control to next row
    TABLOCK
    );'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO

我建议您重新考虑这种设计并创建一个带有股票代码列的表,并将所有文件导入到一个表中。下面是这个方法的一个例子:

CREATE TABLE dbo.all_tickers(
  ticker_symbol varchar(32) NOT NULL,
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL,
  PRIMARY KEY (ticker_symbol, [Date])
);
GO

DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);
CREATE TABLE #ticker_staging(
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL
  );

SET @SQL = (SELECT N'
TRUNCATE TABLE #ticker_staging;
BULK INSERT #ticker_staging
    FROM ''' + @Path + N'\' + ticker + N'.csv''
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = '','',  --CSV field delimiter
    ROWTERMINATOR = ''\n'',   --Use to shift the control to next row
    TABLOCK
    );
INSERT INTO dbo.all_tickers WITH (TABLOCKX)(
  ticker_symbol,
  [Date],
  [Open],
  High,
  Low,
  [close],
  Volume
) 
SELECT
  ''' + ticker + N''',
  [Date],
  [Open],
  High,
  Low,
  [close],
  Volume
FROM #ticker_staging;'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO

【讨论】:

  • 要创建一个表,我是否需要一个包含所有符号数据的单个 CSV 以及一个附加列,或者可以通过多个 CSV 中的数据来实现单个表?
  • @f_hashim,不需要单个,尽管避免动态 SQL 是可取的。我为单个目标表和多个源文件添加了一个示例。
  • 赞赏。我正在通过您的示例来建立更好的理解,我相信单个表会更可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2020-01-23
  • 1970-01-01
  • 2011-09-26
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多