2011-09-19 12 views
9

आयात करने के लिए OpenRowSet का उपयोग करते समय वैज्ञानिक नोटेशन को फ़्लोट करने के लिए कनवर्ट करें I SQL सर्वर में एक csv फ़ाइल आयात करने के लिए openrowset का उपयोग कर रहा हूं। सीएसवी फ़ाइल में कॉलम में से एक में वैज्ञानिक नोटेशन (1.08 ई + 05) और तालिका में कॉलम डाला जा रहा है जिसमेंएक सीएसवी फ़ाइल

डिफ़ॉल्ट रूप से यह 1 के रूप में मान आयात कर रहा है और .08E + 05 को अनदेखा कर रहा है।

मैंने क्वेरी निष्पादित होने पर सीधे मूल्य को रूपांतरित करने के साथ-साथ वर्ण स्ट्रिंग के रूप में तालिका में डेटाटाइप सेट करने और इसे आयात करने के लिए कास्ट() और कन्वर्ट() का उपयोग करने का प्रयास किया है। इन सभी विधियों में वही व्यवहार है जहां .08 ई + 05 को अनदेखा किया जाता है।

क्या सीएसवी फ़ाइल को बदलने के बिना .08E + 05 के बिना 1 के बजाय 108000 के रूप में आयात करने का कोई तरीका है? नहीं और 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 

:

एक varchar के रूप में डेटाप्रकार की स्थापना और csv फ़ाइल में पढ़ने के लिए निम्न कोड के साथ एक ही प्रभाव है प्रतीत होता है इसके बिना मूल्य, उदाहरण के लिए 81000 बिना किसी मुद्दे के आते हैं।

उत्तर

13

BULK INSERT के तरीके मैं अक्सर पाया है कि उसका सरल पहले सभी varchars की एक तालिका में डेटा को स्थानांतरित करने के लिए, तो उद्धृत सीमांकक की तरह बाहरी चीजों से छुटकारा और स्वरूपण को ठीक मिलता है। मुझे याद है कि वैज्ञानिक नोटेशन से छुटकारा पाने के लिए एक समय की बिल्ली है, आप वर्चर टेबल के साथ खेल सकते हैं जब तक आप इसे सही न करें। मुझे याद है कि सभी प्रकार के परिशुद्धता/स्केल संयोजनों का प्रयास तब तक किया जब तक कि मुझे अंततः एक ऐसा नहीं मिला जो संगत था। मैं मेरे लिए लगता है कि यह तो DECIMAL(24,12)FLOAT था ...

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

संपादित जोड़ने क्या मैं repro और/या एक कम जटिल तरीका प्रदर्शित करने के लिए प्रयास करने के लिए किया था।

मैं एक बहुत ही सरल 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 
+1

सवाल आप शायद अभी उपयोग कर सकते हैं 'बदलें चुनें (INT है कि मैं कर रहा हूँ फिर से पढ़ने:

दूसरा, यहाँ एक बेहतर परिवर्तित piefce कि एक स्ट्रिंग को संख्या में कनवर्ट करता है , कन्वर्ट (फ्लोट, '1।08E + 05 '));' - आखिरी बार मैंने वैज्ञानिक नोटेशन पर काम किया था, मैं लॉगमेन से प्रदर्शन काउंटर से निपट रहा था, और मुझे निश्चित रूप से दशमलव स्थानों की आवश्यकता थी ... –

+0

उपरोक्त में से कोई भी समाधान काम करता है अगर मैं स्पष्ट रूप से मूल्य की आपूर्ति करता हूं। सीएसवी फ़ाइल में मेरे पास मान के लिए कॉलम नाम है और यदि मैं इसका उपयोग करता हूं, उदाहरण के लिए CONVERT (INT, CONVERT (FLOAT, COLUMN_NAME_IN_CSV)) मुझे अभी भी वह व्यवहार मिलता है जहां यह केवल पहले अंक को पढ़ता है। विचार? – amarcy

+0

मेरे विचार अभी भी वर्चर्स की एक तालिका में थोक डालने के लिए हैं। आपके सम्मिलित होने पर कुछ और हो रहा है ... openrowset क्वेरी से चुनें क्वेरी प्रकार से मेटाडेटा से तालिका प्रकारों से मिलान करने का प्रयास कर रहा है। यदि आप पहले वर्चर में डाल रहे हैं, तो यह परवाह नहीं करेगा ... –

4

इसे वास्तविक काम के रूप में कास्टिंग करेगा?

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

सबसे पहले, तथ्य यह है कि आप एक वैज्ञानिक संकेतन का मतलब है अपनी संभावना एक्सेल या कुछ है अन्य प्रोग्राम जिसने मूल्य बनाया है, कुछ डेटा खो गया है .... दूसरे शब्दों में, नोटेशन के अंदर मूल संख्या परिवर्तित हो गई थी और इसलिए कुछ संख्याएं और सटीकता खो गई थी। एक्सेल और सीएसवी से कनवर्ट करने वाले कई माइक्रोसॉफ्ट उत्पादों के साथ एक समस्या है। अब

CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0)))) 
असल में अपने मामले में
+1

..... कुछ डेटा खो गया है ...... यह कई माइक्रोसॉफ्ट उत्पादों के साथ एक समस्या है जो Excel और CSV ..... से कनवर्ट करते हैं। एक और। एक्सेल स्थापित नहीं किया जा रहा है किसी भी प्रकार के डेटा काम के लिए काफी शर्त है। समस्या आपके ग्राहकों को Excel को अनइंस्टॉल करने के लिए मिल रही है काफी मुश्किल है :) – DaveBoltman

संबंधित मुद्दे