2011-09-19 17 views
9

Używam openrowset do importowania pliku csv do SQL Server. Jedna z kolumn w pliku csv zawiera liczby w notacji naukowej (1.08E + 05) i kolumnę w tabeli, do której jest wstawianyKonwersja notacji naukowej na zmiennoprzecinkowe podczas używania OpenRowSet do importowania pliku .CSV

Domyślnie importuje wartość jako 1 i ignoruje .08E + 05.

Próbowałem użyć metody cast() i convert(), aby przekonwertować wartość bezpośrednio podczas wykonywania zapytania, a także ustawić typ danych w tabeli jako ciąg znaków i zaimportować go jako taki. Wszystkie te metody zachowują się tak samo, gdy .08E + 05 jest ignorowane.

Czy istnieje sposób na zaimportowanie wartości jako 108000 zamiast 1 bez .08E + 05 bez konieczności zmiany samego pliku csv?

Konfigurowanie typ danych jako varchar i czytanie w pliku csv wydaje się mieć ten sam efekt z następującego kodu:

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 

Nie wszystkie wartości w pliku CSV mają notacji naukowej i wartość bez niego, np 81000 natrafia bez problemu.

Odpowiedz

13

Dla BULK INSERT metodologii ja często znajdując prościej najpierw przenieść dane do tabeli wszystkich varchars, a następnie pozbyć się obcych rzeczy jak cytowane ogranicznikami i naprawić formatowanie. Pamiętam, że miałem sporo czasu, aby pozbyć się zapisu naukowego, po prostu możesz grać z tabelą varchar, dopóki nie zrozumiesz. Pamiętam, jak próbowałem różnych kombinacji precyzji i skali, aż w końcu znalazłem jeden, który był zgodny. Myślę, że dla mnie to było FLOAT następnie DECIMAL(24,12) ...

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

EDIT dodając co zrobiłem próbę powtórzenia błędu i/lub wykazywać mniej zawiłą drogę.

I stworzył bardzo prosty plik CSV:

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

Wtedy wpadłem następujący kod (z jakiegoś powodu nie mogę dostać MSDASQL uruchomić na moim komputerze, aby zapisać swoje życie):

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; 

Wyniki:

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 
+1

Właściwie w przypadku teraz, że jestem ponownie czyta pytanie prawdopodobnie można po prostu użyć 'SELECT CONVERT (INT , CONVERT (FLOAT, "1.08E + 05 ')); '- ostatnio pracowałem nad notacją naukową, miałem do czynienia z licznikami wydajności z LogMan, i zdecydowanie potrzebowałem miejsc dziesiętnych ... –

+0

Każde z powyższych rozwiązań działa, jeśli podam wartość wprost. W pliku CSV mam nazwę kolumny dla wartości i jeśli jej używam, na przykład CONVERT (INT, CONVERT (FLOAT, COLUMN_NAME_IN_CSV)) nadal otrzymuję zachowanie, w którym odczytuje tylko pierwszą cyfrę. Myśli? – amarcy

+0

Moje myśli nadal mają na celu wprowadzenie do tabeli varcharów. Może się zdarzyć coś innego, gdy twój insert ... wybierz zapytanie openrowsetowe próbuje dopasować typy tabel do metadanych z zapytania. Jeśli najpierw wstawiasz do varcharu, to nie będzie to miało znaczenia ... –

4

Czy odlewanie to prawdziwa praca?

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

Przede wszystkim fakt, że masz notacja naukowa oznacza jego prawdopodobne Excel lub niektórych inny program, który utworzył wartość, utracił pewne dane ... innymi słowy, pierwotny numer wewnątrz notacji został przekonwertowany, a więc utracono pewną liczbę i dokładność. to problem z wieloma produktami Microsoft, które konwertują z Excela i CSV.

drugie, tutaj jest lepiej konwersji piefce który konwertuje liczbę na łańcuch:

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

..... zgubił niektóre dane ...... to jest problem z wieloma produktami Microsoft, które konwertują z Excela i CSV ..... dokładnie. Plus jeden. Brak zainstalowanego programu Excel jest prawie niezbędny do pracy z jakimkolwiek rodzajem danych. Problem polega na tym, że twoi klienci muszą odinstalować program Excel jest dość trudny :) – DaveBoltman

Powiązane problemy