gpt4 book ai didi

sql-server - 使用 OpenRowSet 导入 .CSV 文件时将科学计数法转换为 float

转载 作者:行者123 更新时间:2023-12-02 10:39:40 26 4
gpt4 key购买 nike

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

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

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

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

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

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 没有遇到任何问题。

最佳答案

对于BULK INSERT 方法,我经常发现首先将数据移动到所有 varchar 的表中,然后删除无关的东西(例如引用的分隔符)并修复格式更简单。我记得有一段时间摆脱了科学记数法,你可以直接使用 varchar 表,直到你找到正确的方法。我记得尝试过各种精度/比例组合,直到最终找到兼容的组合。我认为对我来说它是 FLOAT 然后是 DECIMAL(24,12)...

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

编辑添加我所做的尝试重现和/或演示一种不太复杂的方式。

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

StartDate,Value
20110808,81000
20110808,1.08E+05

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

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;

结果:

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

关于sql-server - 使用 OpenRowSet 导入 .CSV 文件时将科学计数法转换为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com