सीएसवी से एसक्यूएल थोक आयात

मुझे एक SQL सर्वर में एक बड़ी सीएसवी फ़ाइल आयात करने की आवश्यकता है। मैं इसका उपयोग कर रहा हूँ:

BULK 
INSERT CSVTest
        FROM 'c:\csvfile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

समस्या यह है कि मेरे सभी फ़ील्ड उद्धरण ("") से घिरे हुए हैं, इसलिए एक पंक्ति वास्तव में दिखती है:

"1","","2","","sometimes with comma , inside", "" 

क्या मैं किसी भी तरह थोक आयात कर सकता हूं और उद्धरणों का उपयोग फ़ील्ड डिलीमीटर के रूप में करने के लिए कह सकता हूं?

Edit: The problem with using '","' as delimiter, as in the examples suggested is that : What most examples do, is they import the data including the first " in the first column and the last " in the last, then they go ahead and strip that out. Alas my first (and last) column are datetime and will not allow a "20080902 to be imported as datetime.

जो मैं पढ़ रहा हूं उससे मुझे लगता है कि फॉर्मेटफ़ाइल जाने का तरीका है, लेकिन दस्तावेज़ीकरण (एमएसडीएन समेत) बहुत ही अनुपयोगी है।

0
आपको इस sqlserver को फिर से टैग करना चाहिए ताकि हम जान सकें कि आप किस डेटाबेस का उपयोग कर रहे हैं।
जोड़ा लेखक JasonS, स्रोत

12 उत्तर

आपको बीसीपी/बल्क इंसर्ट के साथ देखना होगा क्योंकि न तो बीएसपी या थोक सम्मिलन इस संभाल को संभालता है अगर उद्धरण संगत नहीं है, यहां तक ​​कि प्रारूप फ़ाइलों के साथ भी (यहां तक ​​कि एक्सएमएल प्रारूप फाइलें विकल्प भी नहीं देती हैं) और डमी ["] अक्षर शुरुआत और अंत और [","] को विभाजक के रूप में उपयोग करते हुए। तकनीकी रूप से सीएसवी फ़ाइलों को [@] वर्णों की आवश्यकता नहीं है यदि कोई एम्बेडेड [] वर्ण नहीं हैं

इस कारण से अल्पविराम-सीमित फ़ाइलों को कभी-कभी कॉमेडी-सीमित फ़ाइलों के रूप में जाना जाता है।

OpenRowSet को सर्वर पर एक्सेल की आवश्यकता होगी और 64-बिट वातावरण में समस्याग्रस्त हो सकता है - मुझे पता है कि 64-बिट में जेट में Excel का उपयोग करके समस्याग्रस्त है।

एसएसआईएस वास्तव में आपकी सबसे अच्छी शर्त है यदि फ़ाइल भविष्य में आपकी अपेक्षाओं से अलग होने की संभावना है।

0
जोड़ा

OpenRowSet आज़माएं। इसका उपयोग एक्सेल सामान आयात करने के लिए किया जा सकता है। एक्सेल सीएसवी फाइलें खोल सकता है, इसलिए आपको केवल सही [कनेक्शनस्ट्रिंग] [2] को समझने की आवश्यकता है।

[2]: चालक = {माइक्रोसॉफ्ट टेक्स्ट ड्राइवर (* .txt; * .csv)}; डीबीक = सी: \ txtFilesFolder \; एक्सटेंशन = एसीएस, सीएसवी, टैब, txt;

0
जोड़ा

एक और हैक जिसे मैं कभी-कभी उपयोग करता हूं, एक्सेल में सीएसवी खोलना है, फिर प्रत्येक पंक्ति के अंत में अपने एसक्यूएल स्टेटमेंट को सेल में लिखें। उदाहरण के लिए:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")

एक भरने के लिए यह आपके लिए हर पंक्ति में populate कर सकते हैं। फिर आउटपुट को एक नई क्वेरी विंडो में कॉपी और पेस्ट करें।

यह पुराना स्कूल है, लेकिन अगर आपको केवल थोड़ी देर में आयात करने की ज़रूरत है तो यह आपको 'अस्पष्ट' तरीके से सभी अस्पष्ट दस्तावेज पढ़ने के साथ गड़बड़ कर देता है।

0
जोड़ा
अच्छा टिप, @jorgeburgos
जोड़ा लेखक karlgrz, स्रोत
मुझे पता है कि यह जवाब प्राचीन है, लेकिन मैं अभी कुछ इसी तरह के लिए Google खोज के साथ मिला हूं। यह बहुत अच्छा समय है कि आप टैब्यूलर डेटा से कोई भी कोड जेनरेट करना चाहते हैं, सिर्फ कोड को SQL कथन लोड करने के लिए नहीं। आप Excel फ़ाइल में कहीं भी एक टेम्पलेट डाल सकते हैं, फिर = सबस्टिट्यूट ($ Z $ 999, "प्लेसहोल्डर_ए", "'" और सबस्टिट्यूट (ए 2, "'", "''") और "'") करें, "प्लेसहोल्डर_बी", सबस्टिट्यूट (बी 2, "'", "' '")) । मान लें कि आपके पास $ Z $ 999 में एक टेम्पलेट है।
जोड़ा लेखक Don 01001100, स्रोत
अच्छा टिप, धन्यवाद!
जोड़ा लेखक DanB, स्रोत

क्या आपको प्रोग्रामेटिक रूप से ऐसा करने की ज़रूरत है, या यह एक बार का शॉट है?

एंटरप्राइज़ मैनेजर का उपयोग करके, आयात डेटा पर राइट-क्लिक करने से आप अपना डिलीमीटर चुन सकते हैं।

0
जोड़ा

यदि आप डेटाटेबल में फ़ाइल को पार्स करने के तरीके को समझते हैं, तो मैं SQL सर्वर में डालने के लिए SqlBulkInsert क्लास का सुझाव दूंगा।

0
जोड़ा

आप डीटीएस या एसएसआईएस का भी उपयोग कर सकते हैं।

0
जोड़ा

Try FIELDTERMINATOR='","'

पहले और आखिरी उद्धरण के साथ मदद करने के लिए यहां एक शानदार लिंक है ... देखो कि उसने एसपी को प्रतिस्थापित करने का उपयोग कैसे किया

http://www.sqlteam.com/article/का उपयोग कर-थोक डालने करने वाली लोड एक पाठ फ़ाइल

0
जोड़ा
मेरे लिए भी काम किया। मैं एक एक्सएमएल प्रारूप फ़ाइल का उपयोग कर रहा हूं ताकि FIELDTERMINATOR के बजाय टर्मिनेटर विशेषता का उपयोग किया गया हो। इसके अलावा, मेरे अंतिम कॉलम पर मैंने निम्नलिखित टर्मिनर = '"\ r \ n'
जोड़ा लेखक Craig McKeachie, स्रोत
यह काम नहीं करेगा :-( तालिका में पहला क्षेत्र एक डेटाटाइम है और यह इसके साथ अग्रणी उद्धरण (") आयात करेगा, एक त्रुटि उत्पन्न करेगा
जोड़ा लेखक Radu094, स्रोत
उन अनुप्रयोगों से सावधान रहें जो सीएसवी को उद्धृत तारों के साथ निर्यात करते हैं लेकिन संख्याओं को उद्धृत नहीं किया जाता है।
जोड़ा लेखक finnw, स्रोत

क्या आपके पास इनपुट प्रारूप पर नियंत्रण है? | (पाइप), और \ टी आमतौर पर बेहतर क्षेत्र टर्मिनेटर के लिए बनाते हैं।

0
जोड़ा

मुझे पता है कि यह एक असली समाधान नहीं है लेकिन मैं सब कुछ के लिए nvarchar सेट के साथ आयात के लिए एक डमी टेबल का उपयोग करता हूं। फिर मैं एक ऐसा सम्मिलित करता हूं जो "अक्षर" करता है और रूपांतरण करता है। यह सुंदर नहीं है लेकिन यह काम करता है।

0
जोड़ा
उद्धरणों के बीच अल्पविराम हो सकता है जब आप फ़ील्ड को कैसे विभाजित करते हैं?
जोड़ा लेखक Jeremy Stein, स्रोत

आईडी का कहना है कि फाइलहेल्पर का एक ओपन सोर्स लाइब्रेरी का उपयोग करें

0
जोड़ा

एफआईआरएस आपको डेटा तालिका में सीएसवी फ़ाइल आयात करने की आवश्यकता है

फिर आप SQLBulkCopy का उपयोग करके थोक पंक्तियां डाल सकते हैं

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

           //Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

           //Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

           //Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

           //Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

           //Let's populate the datatable with our stats.
           //You can add as many rows as you want here!

           //Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

           //Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

           //Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}
0
जोड़ा