Преобразование научной нотации в float при использовании OpenRowSet для импорта a.Файл CSV

Я использую openrowset для импорта csv-файла в SQL Server. Один из столбцов в csv-файле содержит цифры в научной нотации (1.08 E+05), а столбец в таблице вставляется

по умолчанию он импортирует значение как 1 и игнорирует .08E+05.

Я попытался использовать cast () и convert (), чтобы преобразовать значение непосредственно при выполнении запроса, а также настроить тип данных в таблице в качестве символьной строки и импортировать его как такие. Все эти методы имеют одинаковое поведение, где .08E+05 игнорируется.

есть ли способ импортировать значение как 108000 вместо 1 Без .08E + 05 без необходимости изменять сам файл csv?

настройка типа данных как 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 приходите без проблем.

3 ответов


на BULK INSERT методологии мне часто казалось проще сначала переместить данные в таблицу всех varchars, а затем избавиться от посторонних вещей, таких как цитируемые разделители и исправить форматирование. Я помню, как чертовски долго избавлялся от научной нотации, вы можете просто играть с таблицей varchar, пока не получите ее правильно. Я помню, как пытался все виды комбинаций точности / масштаба, пока я, наконец, не нашел тот, который был совместим. Я думаю, для меня это было FLOAT затем DECIMAL(24,12)...

SELECT 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

прежде всего, тот факт, что у вас есть научная нотация, означает, что ее вероятный Excel или какая-то другая программа, которая создала значение, потеряла некоторые данные....другими словами, исходное число внутри нотации было преобразовано, и поэтому некоторые числа и точность были потеряны. это проблема со многими продуктами Microsoft, которые преобразуются из Excel и CSV.

во-вторых, вот лучшее преобразование piefce, которое преобразует число в строку:

CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))

будет ли кастинг настоящей работой?

select cast('1.08E+05' as real)