将Betfair csv数据导入SQL Server并将数据部署到正确的表和列

将Betfair csv数据导入SQL Server并将数据部署到正确的表和列,sql,sql-server,csv,Sql,Sql Server,Csv,我正在开发我的第一个数据库,已经建立了一个结构并输入了一些数据,这样我就可以在上面测试一些查询。这很好,但现在我需要开始从csv文件导入数据。我一直在寻求这方面的帮助,但没有找到任何能描述我具体情况的方法 我拥有的数据文件的格式如下: #File Header, 1.0 Home Team,Barnsley Away Team,Wigan Kick Off Time,14:02 Kick Off Date,03/08/2013 Home Goals,0 Away Goals,4 #File Da

我正在开发我的第一个数据库,已经建立了一个结构并输入了一些数据,这样我就可以在上面测试一些查询。这很好,但现在我需要开始从csv文件导入数据。我一直在寻求这方面的帮助,但没有找到任何能描述我具体情况的方法

我拥有的数据文件的格式如下:

#File Header, 1.0
Home Team,Barnsley
Away Team,Wigan
Kick Off Time,14:02
Kick Off Date,03/08/2013
Home Goals,0
Away Goals,4
#File Data, 1.0
First Time Taken,Latest Time Taken,Market,Outcome,Odds,Number of Bets,Volume Matched,In Play
02/08/2013 20:38:53,03/08/2013 09:50:30,Correct Score,3 - 1,36,6,21.56,0
03/08/2013 14:04:24,03/08/2013 15:22:57,Over/Under 3.5 Goals,Over 3.5 Goals,3.65,4,58.04,1
03/08/2013 14:40:08,03/08/2013 15:03:09,Match Odds,The Draw,5,45,405.4,1
03/08/2013 13:20:37,03/08/2013 13:20:37,Half Time/Full Time,Draw/Wigan,5.7,2,5.24,0
03/08/2013 10:17:21,03/08/2013 10:17:37,DRAW NO BET,Wigan,1.56,5,35.98,0
03/08/2013 15:13:30,03/08/2013 15:13:30,2nd Goal,Barnsley,3.05,2,13.08,0
03/08/2013 14:21:33,03/08/2013 14:21:33,Over/Under 2.5 Goals,Over 2.5 Goals,2.64,2,7,1
03/08/2013 14:05:45,03/08/2013 14:31:10,Match Odds,Wigan,2.18,66,2775.8,1
03/08/2013 12:34:31,03/08/2013 13:26:26,Over/Under 2.5 Goals,Over 2.5 Goals,1.97,20,273.1,0
03/08/2013 15:30:14,03/08/2013 15:32:28,Over/Under 3.5 Goals,Over 3.5 Goals,4.9,10,118.36,1
03/08/2013 14:26:40,03/08/2013 14:29:43,Correct Score,0 - 0,6.8,12,278.96,1
03/08/2013 15:15:34,03/08/2013 15:27:39,Match Odds,Barnsley,110,7,8.86,1
我看到了一些代码示例,我认为这些示例适用于表格数据的主要部分,但我也看到了文件顶部的部分,其中包含单个值。我需要数据库中的所有数据,我还需要能够输入“比赛”(联赛/杯),因为该信息不在CSV中。我的csv按竞争对手在文件夹中排序,因此如果我可以选择一个文件夹导入所有csv,然后在导入之前输入CompetitionID,这将是一件好事。csv第一部分中的值需要进入我的“匹配”表,其余部分进入“数据”表。我将MatchID作为“Match”中的主键,并作为“Data”中的外键。
首先,我想问一下,首先将数据导入“测试”表,然后将其移动到“活动”表是否是一个好主意?或者我应该这样做只是为了测试代码,然后在将来直接导入到活动表?另外,如果有人能为我提供一些指导,指导我如何开始编写以这种格式导入数据的脚本,我将不胜感激。

自从发布上述问题以来,我一直在努力寻找解决方案。我现在可以导入单个CSV文件,并将数据放入数据库的“匹配”和“数据”表中。我还可以从我的“团队”表中查找团队ID,并将该ID与数据一起放在正确的位置。到目前为止,这是我的解决方案,我将在改进代码时尝试更新它。我觉得我的方法可能有点复杂,因为我是SQL编程新手,所以如果有人能就如何提高代码效率提出建议,那就太好了:

USE BetfairFootballDB

CREATE TABLE #CSVTest_Data
(FirstTimeTaken DATETIME,
LatestTimeTaken DATETIME,
Market VARCHAR(50),
Outcome VARCHAR(50),
Odds DECIMAL,
NumberOfBets TINYINT,
VolumeMatched DECIMAL,
InPlay TINYINT)

CREATE TABLE #CSVTest_Match
(Header VARCHAR(50),
Data VARCHAR(50))

BULK
 INSERT #CSVTest_Data
FROM 'D:\Data\csvtest.csv' -- CSV file containing data
WITH
(
FIRSTROW =4,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

BULK
 INSERT #CSVTest_Match
FROM 'D:\Data\csvtest.csv' -- CSV file containing data
WITH
(
FIRSTROW =2,
LASTROW=7,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

----Check the content of the table.
--SELECT *
--FROM #CSVTest_Data

----Check the content of the table.
--SELECT *
--FROM #CSVTest_Match

------------------------------------

-- Convert imported CSV data from row data to column data
CREATE TABLE #temp1 (
    CompetitionID tinyint, 
    DateKickOff datetime, 
    TimeKickOff time(7),
    TeamIDHome tinyint, 
    TeamIDAway tinyint,
    TeamNameHome varchar(50), 
    TeamNameAway varchar(50), 
    ScoreHome tinyint, 
    ScoreAway tinyint,
)
--ALTER TABLE #temp1 ADD CONSTRAINT DF_CompetitionID DEFAULT 2 FOR CompetitionID;
ALTER TABLE #temp1 ADD DEFAULT 2 FOR CompetitionID --Set as default value that must be manually modified until I find a better way to specify this

INSERT INTO #temp1 (DateKickOff, TimeKickOff, TeamNameHome, TeamNameAway, ScoreHome, ScoreAway)
SELECT * FROM
(SELECT Header, Data FROM #CSVTest_Match) AS T
PIVOT (Min(Data) FOR Header IN ([Kick Off Date], [Kick Off Time], [Home Team], [Away Team], [Home Goals], [Away Goals])) AS T2

CREATE TABLE #temp2 (
    TeamIDHome tinyint, 
    TeamIDAway tinyint, 
)
INSERT INTO #temp2 (TeamIDHome, TeamIDAway)
select HomeTeam.TeamID as TeamIDHome, AwayTeam.TeamID as TeamIDAway
from #temp1 as U
join BetfairFootballDB..Team as HomeTeam on U.TeamNameHome = HomeTeam.TeamName
join BetfairFootballDB..Team as AwayTeam on U.TeamNameAway = AwayTeam.TeamName

ALTER TABLE #temp1
DROP COLUMN TeamNameHome
ALTER TABLE #temp1
DROP COLUMN TeamNameAway

UPDATE #temp1
SET #temp1.TeamIDHome = #temp2.TeamIDHome 
FROM #temp2
UPDATE #temp1
SET #temp1.TeamIDAway = #temp2.TeamIDAway
FROM #temp2

INSERT INTO  BetfairFootballDB..Match --(CompetitionID, DateKickOff, TimeKickOff, TeamIDHome, TeamIDAway, ScoreHome, ScoreAway)
SELECT *
FROM #temp1

--Process Match END
-----------------------------------------------------------
--Process Data BEGIN

ALTER TABLE #CSVTest_Data ADD MatchID INT


update #CSVTest_Data
     Set MatchID = (SELECT TOP 1 MatchID FROM BetfairFootballDB..Match
                   ORDER BY MatchID DESC)


--This code should write the data to the Data table correctly once I have the MatchID column filled in the temp table
INSERT INTO  BetfairFootballDB..Data (MatchID, OddsFirstTimeTaken, OddsLastTimeTaken, MarketName, Outcome, Odds, NumberOfBets, VolumeMatched, InPlay)
SELECT MatchID, FirstTimeTaken, LatestTimeTaken, Market, Outcome, Odds, NumberOfBets, VolumeMatched, InPlay
FROM #CSVTest_Data


SELECT *
   FROM BetfairFootballDB..Match
SELECT *
   FROM BetfairFootballDB..Data
-------------------------------------------------------------
DROP TABLE #temp1
DROP TABLE #temp2
DROP TABLE #CSVTest_Data
DROP TABLE #CSVTest_Match