.NET

2009-01-09 5 views
6

में एक्सेल से आयात करते समय वैज्ञानिक नोटेशन मेरे पास एक सी #/नेट जॉब है जो एक्सेल से डेटा आयात करता है और फिर इसे संसाधित करता है। हमारा ग्राहक फाइलों को छोड़ देता है और हम उन्हें संसाधित करते हैं (महत्वपूर्ण क्योंकि मेरे पास मूल फ़ाइल पर कोई नियंत्रण नहीं है)।.NET

मैं डेटासेट भरने के लिए ओलेडीबी लाइब्रेरी का उपयोग करता हूं (मुझे उस कोड को लिखने से नफरत है। गंभीरता से, क्या कोई कोड है जो नेट डेवलपर उस से अधिक लिख रहा है?)। फ़ाइल में कुछ संख्याएं हैं जैसे 30829300, 30071500, आदि ... उन कॉलम के लिए डेटा प्रकार "टेक्स्ट" है।

जब मैं डेटा आयात करता हूं तो उन संख्याओं को वैज्ञानिक नोटेशन में परिवर्तित कर दिया जाता है। क्या ऐसा होने से रोकने के लिए वैसे भी है?

-क्रिस

+0

क्या डेटा प्रकार आप आयात कर रहे हैं संख्याओं की स्ट्रिंग में? – scottm

उत्तर

3

ओलेडीबी लाइब्रेरी , अधिकतर नहीं, एक्सेल स्प्रेडशीट में आपके डेटा को गड़बड़ कर देगा। यह काफी हद तक है क्योंकि यह प्रत्येक कॉलम में पहले 8 कोशिकाओं में मानों से प्रत्येक कॉलम के प्रकार पर अनुमानित अनुमानित एक निश्चित प्रकार के कॉलम लेआउट में सबकुछ मजबूर करता है। यदि यह गलत लगता है, तो आप वैज्ञानिक-नोटेशन में परिवर्तित अंकों के तारों के साथ समाप्त होते हैं। Blech!

इससे बचने के लिए आप ओलेडीबी को छोड़कर और सीधे शीट को पढ़ने से बेहतर हैं। आप Excel के COM इंटरफ़ेस (ब्लीच!), या किसी तृतीय-पक्ष .NET Excel- संगत पाठक का उपयोग करके ऐसा कर सकते हैं। SpreadsheetGear ऐसी एक लाइब्रेरी है जो उचित रूप से अच्छी तरह से काम करती है, और इसमें एक इंटरफ़ेस है जो Excel के COM इंटरफ़ेस के समान है।

0

मैं ने पाया है कि सबसे आसान तरीका ज़िप प्रारूप के बजाय बड़े 'नंबर' के साथ स्तंभों के लिए पाठ स्वरूप का चयन करने के लिए है।

+0

जैसा कि मैंने उपरोक्त कहा है, मेरे पास फ़ाइल पर कोई नियंत्रण नहीं है। ग्राहक बनाता है कि। – ChrisDiRulli

0

क्या आपने फ़ील्ड के मूल्य को (int) या शायद (Int64) में डालने का प्रयास किया है, जैसा कि आप इसे पढ़ रहे हैं?

+0

मैं फ़ाइल को "पढ़ नहीं" करता हूं, ओलेडीबी एपीआई ऐसा करता है। मैं बस OleDbDataAdapter पर "भरें" विधि का आह्वान करता हूं और डेटासेट में पास करता हूं। डेटासेट को रसदार स्वादिष्ट डेटा से भर दिया जाता है। – ChrisDiRulli

+0

क्या डेटासेट दृढ़ता से टाइप किया गया है ताकि फ़ील्ड किसी संख्या की अपेक्षा करे? – palehorse

+0

नहीं, यह दृढ़ता से टाइप नहीं किया गया है। – ChrisDiRulli

0

Google पर IMEX = 1 कनेक्शन स्ट्रिंग विकल्प और TypeGuessRows रजिस्ट्री सेटिंग को देखें। सच में, इस के चारों ओर कोई आसान तरीका नहीं है क्योंकि पाठक पहले कुछ पंक्तियों (डिफ़ॉल्ट रूप से 8) को देखकर कॉलम डेटा प्रकारों का अनुमान लगाता है। यदि पंक्तियों में सभी संख्याएं हैं तो आप भाग्य से बाहर हैं।

एक दुर्भाग्यपूर्ण कामकाज जिसे मैंने अतीत में उपयोग किया है, है HDR = NO कनेक्शन स्ट्रिंग विकल्प का उपयोग करना और TypeGuessRows रजिस्ट्री सेटिंग मान को 1 पर सेट करना, जो इसे अपनी डेटाटाइप बनाने के लिए वैध डेटा के रूप में पहली पंक्ति को पढ़ने के लिए मजबूर करता है एक शीर्षलेख के बजाय दृढ़ संकल्प। यह एक हैक है, लेकिन यह काम करता है। कोड टेक्स्ट के रूप में पहली पंक्ति (शीर्षलेख वाला) पढ़ता है, और फिर तदनुसार डेटाटाइप सेट करता है।

रजिस्ट्री को बदलना एक दर्द है (और हमेशा संभव नहीं है) लेकिन मैं मूल मूल्य को बाद में बहाल करने की अनुशंसा करता हूं।

यदि आपके आयात डेटा में हेडर पंक्ति नहीं है, तो वैकल्पिक विकल्प फ़ाइल को प्री-प्रोसेस करना है और अपमानजनक कॉलम में प्रत्येक संख्या से पहले 'अक्षर डालना है। इससे स्तंभ डेटा को टेक्स्ट के रूप में माना जा सकता है।

तो सब कुछ में, इस के आसपास काम करने के लिए हैक्स का एक गुच्छा है, लेकिन वास्तव में कुछ भी मूर्ख नहीं है।

+0

मैंने आईएमईएक्स = 1 संपत्ति की कोशिश की .. कंस स्ट्रिंग "प्रदाता = माइक्रोसॉफ्ट.एसीई.ओएलडीबी.12.0; डेटा स्रोत = # FILEPATH #; विस्तारित गुण = 'एक्सेल 12.0 एक्सएमएल; एचडीआर = नहीं; आईएमईएक्स = 1" लेकिन मूल्य आता है 2,13123219 99 99 99 ई + 18 ........... – dankyy1

+0

के रूप में आपको रजिस्ट्री प्रविष्टि TypeGuessRows भी सेट करना होगा। जैसे मैंने कहा, यह एक दुर्भाग्यपूर्ण हैक है। –

0

मुझे यह समस्या थी, लेकिन एक्सेल COM इंटरफ़ेस या तृतीय पक्ष सॉफ़्टवेयर का उपयोग किए बिना इसके आसपास काम करने में सक्षम था। इसमें थोड़ा प्रसंस्करण ओवरहेड शामिल है, लेकिन मेरे लिए काम कर रहा है।

  1. डेटा में पहले पढ़ा तो इन स्तंभों में से प्रत्येक के साथ एक नया डेटासेट बनाने स्तंभ नाम
  2. प्राप्त करने के लिए, स्ट्रिंग के लिए अपनी डेटाटाइप्स में से प्रत्येक की स्थापना।
  3. इस नए डाटासेट में फिर से डेटा पढ़ें। वोला - वैज्ञानिक नोटेशन अब चला गया है और सब कुछ एक स्ट्रिंग के रूप में पढ़ा जाता है।

यहां कुछ कोड है जो इसे दिखाता है, और एक अतिरिक्त बोनस के रूप में, यह स्टाइलकॉप्ड भी है!

public void ImportSpreadsheet(string path) 
{ 
    string extendedProperties = "Excel 12.0;HDR=YES;IMEX=1"; 
    string connectionString = string.Format(
     CultureInfo.CurrentCulture, 
     "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"{1}\"", 
     path, 
     extendedProperties); 

    using (OleDbConnection connection = new OleDbConnection(connectionString)) 
    { 
     using (OleDbCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = "SELECT * FROM [Worksheet1$]"; 
      connection.Open(); 

      using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
      using (DataSet columnDataSet = new DataSet()) 
      using (DataSet dataSet = new DataSet()) 
      { 
       columnDataSet.Locale = CultureInfo.CurrentCulture; 
       adapter.Fill(columnDataSet); 

       if (columnDataSet.Tables.Count == 1) 
       { 
        var worksheet = columnDataSet.Tables[0]; 

        // Now that we have a valid worksheet read in, with column names, we can create a 
        // new DataSet with a table that has preset columns that are all of type string. 
        // This fixes a problem where the OLEDB provider is trying to guess the data types 
        // of the cells and strange data appears, such as scientific notation on some cells. 
        dataSet.Tables.Add("WorksheetData"); 
        DataTable tempTable = dataSet.Tables[0]; 

        foreach (DataColumn column in worksheet.Columns) 
        { 
         tempTable.Columns.Add(column.ColumnName, typeof(string)); 
        } 

        adapter.Fill(dataSet, "WorksheetData"); 

        if (dataSet.Tables.Count == 1) 
        { 
         worksheet = dataSet.Tables[0]; 

         foreach (var row in worksheet.Rows) 
         { 
          // TODO: Consume some data. 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

मैंने इस कोड ब्लॉक को थक दिया लेकिन अभी भी sc.notation में मूल्य ... – dankyy1

+0

डर्न! क्या इस तरह की समस्या आपको अपने बालों को पोंछना नहीं चाहती? –

0

मैं इस राज्य आसपास googled .. यहाँ मेरी solulition कदम

  • टेम्पलेट के लिए फ़ाइल उत्कृष्टता

पाठ 2- लिखने मैक्रो के रूप में 1-प्रारूप एक्सेल coloumn निष्क्रिय करने के लिए कर रहे हैं संख्या के लिए त्रुटि चेतावनियां -> पाठ कनवर्टन

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Application.ErrorCheckingOptions.BackgroundChecking = Ture 
End Sub 
Private Sub Workbook_Open() 
Application.ErrorCheckingOptions.BackgroundChecking = False 
End Sub 
  • codebehind पर

3- Int64 या Int32 के लिए आने वाले डेटा पार्स करने के लिए कोशिश आयात करने के लिए डेटा को पढ़ने के दौरान ....

0

मुझे पता है कि अगर किसी को भी इस का उत्तर मिल गया इच्छुक हूँ । मैं इंटरव्यू के ऊपर और नीचे गया हूं और आईएमईएक्स और एचडीआर के सभी संयोजनों की कोशिश की। IMEX = 1 एकमात्र ऐसा है जिसे मैंने दिनांक, मुद्रा और सामान्य संख्या मान निकालने में कामयाब रहे। लेकिन बड़ी संख्या अभी भी वैज्ञानिक के रूप में दिखाई देती है। मुझे केवल फाइलें पढ़ने और स्प्रैडशीट्स बदलने, रजिस्ट्री, तृतीय पक्ष को बदलने का विकल्प नहीं है। इस मुद्दे पर

5

एक वैकल्पिक हल के लिए अपने चयन बयान बदलने के लिए है, बजाय चयन के * ऐसा करते हैं:

"SELECT Format([F1], 'General Number') From [Sheet1$]" 
-or- 
"SELECT Format([F1], \"#####\") From [Sheet1$]" 

हालांकि, ऐसा करने को उड़ाने अगर अपनी कोशिकाओं निम्न त्रुटि के साथ 255 से अधिक वर्ण शामिल होंगे: "एकाधिक-चरण ओएलई डीबी ऑपरेशन त्रुटियों को उत्पन्न करता है। यदि उपलब्ध हो तो प्रत्येक ओएलई डीबी स्थिति मान की जांच करें। कोई काम नहीं किया गया था।"

सौभाग्य से मेरे ग्राहक को इस परिदृश्य में त्रुटि के बारे में परवाह नहीं है। http://www.dicks-blog.com/archives/2004/06/03/external-data-mixed-data-types/

+0

हे। मैंने इस फिक्स का इस्तेमाल किया और यह मेरे लिए चीजों को ठीक करना प्रतीत होता था। समस्या यह है कि यह हर संख्या के चारों ओर घूमता है ताकि पिछले दो अंक शून्य हो। उदाहरण के लिए 12345678 12345600 बन जाता है। क्या किसी को पता है कि मैं इसे कैसे ठीक करूँगा? – Loogawa

1

आप ओपन एक्सएमएल एसडीके 2.0 उत्पादकता उपकरण (या बस का उपयोग कर वास्तविक .XSLX फ़ाइल को देखें, तो फ़ाइल अनज़िप और में XML देखने:

इस पृष्ठ के साथ-साथ प्रयास करने के लिए अच्छी बातें की एक गुच्छा है नोटपैड) आप देखेंगे कि एक्सेल 2007 वास्तव में कच्चे डेटा को वैज्ञानिक प्रारूप में संग्रहीत करता है।

उदाहरण 0.00001 के लिए के रूप में 1.0000000000000001E-5

<x:c r="C18" s="11" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <x:v>1.0000000000000001E-5</x:v> 
</x:c> 

Excel में सेल को देखते हुए संग्रहीत किया जाता है इसके दोनों सेल और सूत्र पट्टी में 0.00001 के रूप में प्रदर्शित। तो यह हमेशा सच नहीं है कि ओलेडीबी इस मुद्दे का कारण बन रहा है।

2

इस कनेक्शन स्ट्रिंग का उपयोग करना:

Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\" 

Excel 2010 के साथ मैं निम्नलिखित पर ध्यान दिया है। यदि आप OLEDB SELECT चलाते हैं तो Excel फ़ाइल खुली होती है तो आपको सहेजे गए फ़ाइल मानों से नहीं, सेल का वर्तमान संस्करण मिलता है। इसके अलावा स्ट्रिंग मान एक लंबे संख्या, दशमलव मान और तारीख नज़र इस तरह के लिए लौट आए:

5.0130370071e+012 
4.08 
36808 

फ़ाइल तो खुला नहीं है जैसा कि लौटने मान हैं:

5013037007084 
£4.08 
Monday, October 09, 2000