9

openrowsetを使用してcsvファイルをSQLServerにインポートしています。csvファイルの列の1つに、科学的記数法(1.08E + 05)の数値と、挿入されるテーブルの列が含まれています

デフォルトでは、値を1としてインポートし、.08E+05を無視します。

cast()とconvert()を使用して、クエリの実行時に値を直接変換し、テーブルのデータ型を文字列として設定してインポートしようとしました。これらのメソッドはすべて、.08E+05が無視されるという同じ動作をします。

csvファイル自体を変更せずに.08E+05なしで値を1ではなく108000としてインポートする方法はありますか?

データ型を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は問題なく検出されます。

4

3 に答える 3

16

方法論についてBULK INSERTは、最初にデータをすべてのvarcharのテーブルに移動してから、引用符で囲まれた区切り文字やフォーマットの修正などの無関係なものを取り除く方が簡単であることがよくあります。科学的記数法を取り除くのにかなりの時間を費やしたことを覚えています。正しくなるまで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
于 2011-09-19T15:17:46.177 に答える
5

実際の作品としてキャストしますか?

select cast('1.08E+05' as real)
于 2011-09-19T15:17:32.033 に答える
5

まず、科学的記数法を使用しているということは、値を作成したExcelまたはその他のプログラムのデータが失われている可能性があることを意味します。つまり、記数法内の元の数値が変換されたため、数値と精度が失われました。失った。これは、ExcelおよびCSVから変換する多くのMicrosoft製品の問題です。

次に、数値を文字列に変換する、より適切な変換ピースを次に示します。

CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))
于 2011-12-15T23:19:24.830 に答える