首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenRowSet导入.CSV文件时将科学记数法转换为浮点型

使用OpenRowSet导入.CSV文件时将科学记数法转换为浮点型
EN

Stack Overflow用户
提问于 2011-09-19 23:09:36
回答 3查看 28.7K关注 0票数 9

我正在使用openrowset将csv文件导入SQL Server。csv文件中的一列包含以科学记数法(1.08E+05)表示的数字以及要插入的表中的列

默认情况下,它将值导入为1并忽略.08E+05。

我尝试过在执行查询时使用cast()和convert()直接转换值,并将表中的数据类型设置为字符串并将其导入。所有这些方法都具有相同的行为,即忽略.08E+05。

有没有办法在没有.08E+05的情况下将值导入为108000而不是1,而不必更改csv文件本身?

将数据类型设置为varchar并读取csv文件似乎与以下代码具有相同的效果:

代码语言:javascript
复制
CREATE TABLE #dataTemp (StartDate datetime, Value varchar(12))

SET @insertDataQuery = 'SELECT Date, CSVValue from OpenRowset(''MSDASQL'', ''Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=' 
SET @insertDataQuery = @insertDataQuery + 'C:\Data\;'',''SELECT * FROM '+ '11091800.csv' + ''')'

INSERT INTO #dataTemp EXEC(@insertDataQuery)

SELECT * FROM #dataTemp

并不是CSV文件中的所有值都有科学记数法和没有科学记数法的值,例如81000没有问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-19 23:17:46

对于BULK INSERT方法,我经常发现更简单的方法是首先将数据移动到包含所有可变字符的表中,然后去掉引号分隔符和修复格式等无关紧要的东西。我记得有一段时间摆脱了科学记数法,你可以只玩varchar表,直到你把它弄对。我记得我尝试过各种精度/小数位数组合,直到我最终找到了一个兼容的。我想对我来说是FLOAT然后是DECIMAL(24,12)..。

SELECT CONVERT(DECIMAL(24, 12), CONVERT(FLOAT, '1.08E+05'));

编辑添加了我所做的,以尝试再现和/或演示不那么复杂的方式。

我创建了一个非常简单的CSV文件:

代码语言:javascript
复制
StartDate,Value
20110808,81000
20110808,1.08E+05

然后我运行了以下代码(由于某种原因,我不能让MSDASQL在我的机器上运行,以挽救我的生命):

代码语言:javascript
复制
CREATE TABLE #dataTemp(StartDate DATETIME, Value VARCHAR(32));

BULK INSERT #dataTemp FROM 'C:\data\whatever.csv' 
    WITH (ROWTERMINATOR='\n', FIELDTERMINATOR=',', FIRSTROW = 2);

SELECT * FROM #dataTemp
GO
SELECT StartDate, CONVERT(INT, CONVERT(FLOAT, Value)) FROM #dataTemp;
GO
DROP TABLE #dataTemp;

结果:

代码语言:javascript
复制
StartDate               Value
----------------------- --------
2011-08-08 00:00:00.000 81000
2011-08-08 00:00:00.000 1.08E+05

StartDate               (No column name)
----------------------- ----------------
2011-08-08 00:00:00.000 81000
2011-08-08 00:00:00.000 108000
票数 16
EN

Stack Overflow用户

发布于 2011-09-19 23:17:32

会把它塑造成一个真正的作品吗?

代码语言:javascript
复制
select cast('1.08E+05' as real)
票数 5
EN

Stack Overflow用户

发布于 2011-12-16 07:19:25

首先,你有一个科学的记数法,这意味着它可能是由Excel或者其他程序产生的,已经丢失了一些data....in,换句话说,记数法中的原始数字被转换了,所以一些数字和准确性就丢失了。这是许多从Excel和CSV转换的Microsoft产品的问题。

其次,下面是一个更好的转换方法,它可以将数字转换为字符串:

代码语言:javascript
复制
CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7473081

复制
相关文章

相似问题

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