首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将从csv文件大容量导入到sql服务器的lat作为空间数据类型?

如何将从csv文件大容量导入到sql服务器的lat作为空间数据类型?
EN

Stack Overflow用户
提问于 2015-06-23 18:46:31
回答 1查看 2.1K关注 0票数 0

我如何将长时间从csv文件作为空间数据类型的lat大容量导入到sql服务器,而不是将类型为double的两个单独的列导入?

给定两个列的输入.csv文件:

Latitude, Longitude

希望创建具有与空间数据类型对应的一列的sql。

EN

回答 1

Stack Overflow用户

发布于 2015-06-23 19:13:54

做了一些研究,发现本文:

将纬度/经度(Lat/Long)转换为地理点

因此,如本文所述,我创建了表,并使用给定的脚本插入了一些测试数据:

代码语言:javascript
复制
CREATE TABLE [dbo].[Landmark] (
    [ID]                INT IDENTITY(1, 1),
    [LandmarkName]      VARCHAR(100),
    [Location]          VARCHAR(50),
    [Latitude]          FLOAT,
    [Longitude]         FLOAT
)
GO

INSERT INTO [dbo].[Landmark] ( [LandmarkName], [Location], [Latitude], [Longitude] )
VALUES ( 'Statue of Liberty', 'New York, USA', 40.689168,-74.044563 ),
       ( 'Eiffel Tower', 'Paris, France', 48.858454, 2.294694),
       ( 'Leaning Tower of Pisa', 'Pisa, Italy', 43.72294, 10.396604 ),
       ( 'Great Pyramids of Giza', 'Cairo, Egypt', 29.978989, 31.134632 ),
       ( 'Sydney Opera House', 'Syndey, Australia', -33.856651, 151.214967 ),
       ( 'Taj Mahal', 'Agra, India', 27.175047, 78.042042 ),
       ( 'Colosseum', 'Rome, Italy', 41.890178, 12.492378 )
GO

然后使用以下查询添加计算列:

代码语言:javascript
复制
ALTER TABLE [dbo].[Landmark]
ADD [GeoLocation] AS geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)
GO

现在,当我使用

代码语言:javascript
复制
SELECT *
FROM dbo.Landmark

我也得到了计算的空间结果:

在axis方面的成果:

希望我能正确理解你。

更新:,我不确定这是否能满足您的要求。它很脏,但是它完成了工作:这就是我格式化CSV文件的方式。我使用了与前面示例相同的结构:

代码语言:javascript
复制
Statue of Liberty| New York, USA| 40.689168|-74.044563
Eiffel Tower| Paris, France| 48.858454| 2.294694
Leaning Tower of Pisa| Pisa, Italy| 43.72294| 10.396604
Great Pyramids of Giza| Cairo, Egypt| 29.978989| 31.134632
Sydney Opera House| Syndey, Australia| -33.856651| 151.214967
Taj Mahal| Agra, India| 27.175047| 78.042042
Colosseum| Rome, Italy| 41.890178| 12.492378

列分隔符是|符号,行分隔符是中断符号。

因此,我使用OPENROWSET打开CSV文件并将其格式化为行,而不是有一个长字符串(不幸的是,这就是OPENROWSET读取csv文件的方式)。我使用了这个SplitString函数:https://stackoverflow.com/a/19935594/3680098

现在,我需要把这些伙伴变成列,而不是一个字符串。我使用了下面提供的答案:https://stackoverflow.com/a/15108499/3680098

总结一下,这是一个查询:

代码语言:javascript
复制
SELECT LTRIM(RTRIM(xmlValue.value('/values[1]/value[1]','nvarchar(100)'))) AS LandmarkName
    , LTRIM(RTRIM(xmlValue.value('/values[1]/value[2]','nvarchar(100)'))) AS Location
    , LTRIM(RTRIM(xmlValue.value('/values[1]/value[3]','nvarchar(20)'))) AS Lon
    , LTRIM(RTRIM(xmlValue.value('/values[1]/value[4]','nvarchar(20)'))) AS Lat
    , GEOGRAPHY::STPointFromText('POINT(' + xmlValue.value('/values[1]/value[4]','nvarchar(20)') + ' ' + xmlValue.value('/values[1]/value[3]','nvarchar(20)') + ')', 4326)
FROM dbo.SplitString((SELECT Document.* FROM OPENROWSET(BULK N'C:\Temp\test.csv', SINGLE_CLOB) AS Document), CHAR(10)) AS T
CROSS APPLY (SELECT CAST('<values><value>' + REPLACE(T.Value, '|', '</value><value>') + '</value></values>' AS XML)) AS T1(xmlValue);

它生成我所需的数据,就像在我的第一张屏幕截图中一样,它看起来很好。因此,我需要做的是创建我的表并将它们插入其中:

代码语言:javascript
复制
CREATE TABLE [dbo].[Landmark] (
    [ID]                INT IDENTITY(1, 1),
    [LandmarkName]      VARCHAR(100),
    [Location]          VARCHAR(50),
    [GeoLocation]       GEOGRAPHY
)
GO

INSERT INTO dbo.Landmark (LandmarkName, Location, GeoLocation)
SELECT LTRIM(RTRIM(xmlValue.value('/values[1]/value[1]','nvarchar(100)'))) AS LandmarkName
    , LTRIM(RTRIM(xmlValue.value('/values[1]/value[2]','nvarchar(100)'))) AS Location
    , GEOGRAPHY::STPointFromText('POINT(' + xmlValue.value('/values[1]/value[4]','nvarchar(20)') + ' ' + xmlValue.value('/values[1]/value[3]','nvarchar(20)') + ')', 4326)
FROM dbo.SplitString((SELECT Document.* FROM OPENROWSET(BULK N'C:\Temp\test.csv', SINGLE_CLOB) AS Document), CHAR(10)) AS T
CROSS APPLY (SELECT CAST('<values><value>' + REPLACE(T.Value, '|', '</value><value>') + '</value></values>' AS XML)) AS T1(xmlValue)

结果:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31011005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档