Преобразование научной нотации в плавающее при использовании OpenRowSet для импорта файла .CSV - PullRequest
9 голосов
/ 19 сентября 2011

Я использую openrowset для импорта файла CSV в SQL Server.Один из столбцов в файле csv содержит числа в научной нотации (1.08E + 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 ]

14 голосов
/ 19 сентября 2011

Для BULK INSERT методологий я часто находил, что проще сначала переместить данные в таблицу всех вариантов, затем избавиться от посторонних вещей, таких как заключенные в кавычки, и исправить форматирование.Я помню, как у меня было немало времени, чтобы избавиться от научной нотации, вы можете просто играть с таблицей 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
5 голосов
/ 16 декабря 2011

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

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

CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))
4 голосов
/ 19 сентября 2011

Будет ли кастинг это как реальная работа?

select cast('1.08E+05' as real)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...