Преобразование научной нотации в 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))))