سؤال

أحتاج إلى استيراد ملف CSV كبير إلى خادم SQL.أنا أستخدم هذا:

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

المشكلة هي أن جميع الحقول الخاصة بي محاطة بعلامات اقتباس (" ") لذا يبدو الصف في الواقع كما يلي:

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

هل يمكنني بطريقة أو بأخرى استيرادها بشكل مجمّع وإخبار SQL باستخدام علامات الاقتباس كمحددات للحقول؟

يحرر:المشكلة في استخدام ""،" كمحدد، كما في الأمثلة المقترحة هي أن:ما تفعله معظم الأمثلة، هو أنها تستورد البيانات بما في ذلك أول " في العمود الأول والأخير " في العمود الأخير، ثم تمضي قدمًا وتحذف ذلك.للأسف، العمود الأول (والأخير) الخاص بي هو تاريخ/وقت ولن يسمح باستيراد "20080902" كتاريخ/وقت.

مما كنت أقرأه في كل مكان، أعتقد أن FORMATFILE هو الحل الأمثل، لكن التوثيق (بما في ذلك MSDN) غير مفيد على الإطلاق.

هل كانت مفيدة؟

المحلول

أعلم أن هذا ليس حلاً حقيقيًا ولكني أستخدم جدولًا وهميًا للاستيراد مع تعيين nvarchar لكل شيء.ثم أقوم بإجراء إدراج يزيل الأحرف " ويقوم بالتحويلات.إنها ليست جميلة ولكنها تؤدي المهمة.

نصائح أخرى

يحاول FIELDTERMINATOR='","'

إليك رابط رائع للمساعدة في الاقتباس الأول والأخير... انظر كيف استخدم السلسلة الفرعية SP

http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

الحيلة الأخرى التي أستخدمها أحيانًا هي فتح ملف CSV في Excel، ثم كتابة بيان SQL الخاص بك في خلية في نهاية كل صف.على سبيل المثال:

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

يمكن للتعبئة ملء هذا في كل صف لك.ثم قم فقط بنسخ ولصق الإخراج في نافذة استعلام جديدة.

إنها مدرسة قديمة، ولكن إذا كنت تحتاج فقط إلى القيام بالاستيراد من حين لآخر، فهذا يوفر عليك العبث بقراءة جميع الوثائق الغامضة بالطريقة "الصحيحة" للقيام بذلك.

يحاول OpenRowSet.يمكن استخدام هذا لاستيراد عناصر Excel.يمكن لـ Excel فتح ملفات CSV، لذلك تحتاج فقط إلى معرفة [ConnectionString] [2] الصحيح.

[2]:برنامج التشغيل = {برنامج تشغيل Microsoft Text (*.txt;*.csv)};Dbq=c: xtFilesFolder\;Extensions=asc,csv,tab,txt;

أقول إن استخدام FileHelpers هو مكتبة مفتوحة المصدر

هل تحتاج إلى القيام بذلك برمجياً، أم أنها لقطة لمرة واحدة؟

باستخدام Enterprise Manager، انقر بزر الماوس الأيمن فوق استيراد البيانات مما يتيح لك تحديد المحدد الخاص بك.

يجب عليك الحذر من BCP/BULK INSERT لأنه لا BSP أو Bulk Insert يتعاملان مع هذا جيدًا إذا كان الاقتباس غير متسق، حتى مع ملفات التنسيق (حتى ملفات تنسيق XML لا توفر الخيار) والأحرف الوهمية ["] في البداية والنهاية واستخدام ["،] كفاصل.من الناحية الفنية، لا تحتاج ملفات CSV إلى أن تحتوي على أحرف ["] إذا لم تكن هناك أحرف [،] مضمنة

ولهذا السبب يُشار أحيانًا إلى الملفات المحددة بفواصل على أنها ملفات محدودة الكوميديا.

سيتطلب OpenRowSet وجود برنامج Excel على الخادم ويمكن أن يسبب مشكلة في بيئات 64 بت - أعلم أن استخدام Excel في Jet في إصدار 64 بت يمثل مشكلة.

يعد SSIS أفضل رهان لك إذا كان من المحتمل أن يختلف الملف عن توقعاتك في المستقبل.

يمكنك تجربة هذا الرمز وهو حلو جدا إذا كنت تريد ، سيؤدي هذا إلى إزالة الفواصل المنقوطة غير المرغوب فيها من التعليمات البرمجية الخاصة بك.إذا كانت بياناتك على سبيل المثال مثل هذا:
"كيلي"،"رينولد"،"kelly@reynold.com"

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**

أولاً، تحتاج إلى استيراد ملف CSV إلى جدول البيانات

ثم يمكنك إدراج صفوف مجمعة باستخدام 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);
                }
            }
        }
    }
}

نعم، ك ريتشارد على حق: FIELDTERMINATOR = '","'

يرى http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file لمزيد من المعلومات.

يمكنك أيضًا استخدام DTS أو SSIS.

هل لديك السيطرة على تنسيق الإدخال؟| (الأنابيب) ، و عادة ما تجعل من نهايات المجال أفضل.

إذا اكتشفت كيفية تحليل الملف في DataTable، فإنني أقترح فئة SqlBulkInsert لإدراجه في SQL Server.

هذا سؤال قديم، لذلك أكتب هذا لمساعدة أي شخص يتعثر عليه.

يقدم SQL Server 2017 معلمة FIELDQUOTE المخصصة لحالة الاستخدام المحددة هذه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top