CSV dosyasını SQL Server'a aktarın


186

.csvSQL Server içine bir dosyayı almak için yardım arıyorum BULK INSERTve birkaç temel sorularım var.

Sorunlar:

  1. CSV dosya verilerinin arasında ,(virgül) olabilir (Örn: açıklama), bu nedenle bu verileri işlerken nasıl içe aktarma yapabilirim?

  2. İstemci CSV'yi Excel'den oluşturursa, virgül içeren veriler ""(çift tırnak) içine [aşağıdaki örnekte] eklenir, böylece içe aktarma bunu nasıl yapabilir?

  3. Bazı satırların hatalı veri içerip içermediğini nasıl izleriz, bu da hangi verileri atlar? (içe aktarılamayan satırları içe aktarır mı)

İşte başlıklı örnek CSV:

Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.

Ve alınacak SQL deyimi:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)

Olabilir SSMS: ithalat (Kopyala / Yapıştır) Nasıl excel veri yardımcı olabilir (Kullanmak istemiyorsanız BULK NSERTya da bunun için izniniz yok).
Denis

Yanıtlar:


169

Tabanlı SQL Server CSV İçe Aktarma

1) CSV dosya verisi ,(Örn: açıklama) arasında (virgül) olabilir , bu nedenle bu verileri işlerken nasıl içe aktarma yapabilirim?

Çözüm

,Sınırlayıcı olarak (virgül) kullanıyorsanız , alan sonlandırıcısı olarak virgül ile verilerinizdeki virgül arasında ayrım yapmanın bir yolu yoktur. Ben farklı kullanırım FIELDTERMINATORgibi ||. Kod benziyordu ve bu virgül ve tek eğik çizgiyi mükemmel şekilde ele alacak.

2) İstemci excel'den csv oluşturursa, virgül içeren veriler " ... "(çift tırnak) içine [aşağıdaki örnekte] eklenir, böylece içe aktarma bunu nasıl yapabilir?

Çözüm

BULK insert kullanıyorsanız, çift tırnakları işlemenin bir yolu yoktur, veriler çift tırnaklarla satırlara eklenir. verileri tabloya ekledikten sonra bu çift tırnak işaretlerini ' ' ile değiştirebilirsiniz .

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')

3) Bazı satırların hatalı verisi olup olmadığını nasıl izleriz, hangi ithalat atlar? (içe aktarma, içe aktarılamayan satırları atlar mı?)

Çözüm

Geçersiz veri veya biçim nedeniyle tabloya yüklenmeyen satırları işlemek için ERRORFILE özelliği kullanılarak işlenebilir , hata dosyası adını belirtin, hata içeren satırları hata dosyasına yazar. kodu gibi görünmelidir.

BULK INSERT SchoolsTemp
    FROM 'C:\CSVData\Schools.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
    TABLOCK
    )

1
Yardım için teşekkürler. 1. Çözüm: Yaratabilir miyiz || Excel'den ayrılan değer dosyası? Çünkü kaynak dosyaların yaklaşık% 20'si istemci tarafından Excel kullanılarak oluşturulur.
Prabhat

@Prabhat Excel dosyalarını SQL Server'a nasıl yüklüyorsunuz?
Vishwanath Dalvi

Bunlar yüklediğim Excel dosyaları değil. İstemci .CSV dosyaları oluşturmak için Excel'i kullanıyor (uygulamamızın içe aktardığı kaynak verilerin% 20'si için). Excel kullanarak csv dosyaları oluşturup oluşturmamamızı soruyordum || sütun değeri ayırıcı olarak?
Prabhat

İstemcinin Excel'den CSV dosyalarını nasıl oluşturduğu üzerinde etkiniz varsa, onlara Excel'de ayırıcı karakterin nasıl ayarlanacağını öğretebilirsiniz (ve artık artık "virgül" ile ayrılmış bir dosya değil, boru (|) ile ayrılmış, Örneğin, bunun için atladığınız çemberler göz önüne alındığında ve SSIS'niz varsa - bunu kontrol etmenizi öneririm.SQL Server 2012 ve sonraki sürümlerinin çok güçlü bir SSIS tasarımcısı (VS 2012 ve daha sonraki sürümlerde) istemcinizin size csv yerine excel dosyalarını göndermesini
sağlayın

Bunun tamamen doğru olduğundan emin değilim. SQL Toplu Ekleme'de çift tırnaklarla başa çıkabilirsiniz. Bu konuda bir Yığın Taşması var ve bir Toplu Ekleme değişken sınırlayıcıları öğretmek için biçim dosyaları kullanabilirsiniz. stackoverflow.com/questions/25726385/… advancesharp.com/blog/1083/…
DtechNet

33

Öncelikle veritabanınızda CSV dosyasını içe aktaracağınız bir tablo oluşturmanız gerekir. Tablo oluşturulduktan sonra aşağıdaki adımları izleyin.

• SQL Server Management Studio'yu kullanarak veritabanınıza giriş yapın

• Veritabanınıza sağ tıklayın ve Tasks -> Import Data...

Next >düğmesine tıklayın

• Veri Kaynağı için öğesini seçin Flat File Source. Ardından CSV dosyasını seçmek için Gözat düğmesini kullanın. Next >Düğmeye tıklamadan önce verilerin nasıl içe aktarılmasını istediğinizi yapılandırmak için biraz zaman ayırın .

• Hedef için doğru veritabanı sağlayıcısını seçin (örn. SQL Server 2012 için SQL Server Yerel İstemci 11.0'ı kullanabilirsiniz). Sunucu adını girin. Use SQL Server AuthenticationRadyo düğmesini kontrol edin . Next >Düğmeye tıklamadan önce Kullanıcı adını, Parolayı ve Veritabanını girin .

• Kaynak Tabloları ve Görünümleri Seç penceresinde, Next >düğmeyi tıklamadan önce Eşlemeleri Düzenleyebilirsiniz .

Run immediatelyOnay kutusunu işaretleyin ve Next >düğmesine tıklayın.

FinishPaketi çalıştırmak için düğmesine tıklayın .

Yukarıda bu web sitesinde bulundu (kullandım ve test):



1
O alma işlemi sırasında oluşturulabilir, tablo önceden oluşturmak için gerekli değildir
bside

1
Bir web sayfasındaki oh-so-yararlı satır "Verilerin nasıl içe aktarılmasını istediğinizi yapılandırmak için biraz zaman harcayın" ile kesip yapıştırmanızı seviyorum . Aradığım her şey buydu : Yapılandıramıyorum gibi görünüyor!
Auspex

Oh ve Windows Kimlik Doğrulaması'nı çok iyi kullanmak isteyebileceğinizden, "SQL Server Kimlik Doğrulamasını Kullan radyo düğmesini kontrol edin" yanlış. Sizin için hangisi işe yarıyorsa.
Auspex

teşekkürler yukarıdaki prosedür uygulamak için görüntüleri ile adım adım bir prosedür bulundu, bir göz değer: qawithexperts.com/article/sql/…
user3559462

23

2) İstemci excel'den csv oluşturursa, virgül içeren veriler "..." (çift tırnak) [aşağıdaki örnekte] içine alınır, böylece içe aktarma bunu nasıl yapabilir?

FORMAT = 'CSV', FIELDQUOTE = '"' seçeneklerini kullanmalısınız:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FORMAT = 'CSV', 
    FIELDQUOTE = '"',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)

1
FORMAT belirtecinin yalnızca SQL Server 2017'den beri kullanılabildiğini unutmayın.
kristianp

13

Veri sorunundaki virgülün çözümlenmesinin en iyi, en hızlı ve en kolay yolu, Windows 'liste ayırıcı ayarını virgül (boru gibi) dışında bir şeye ayarladıktan sonra virgülle ayrılmış bir dosyayı kaydetmek için Excel'i kullanmaktır. Bu, daha sonra içe aktarabileceğiniz bir boru (veya her neyse) ayrılmış bir dosya oluşturur. Bu burada açıklanmaktadır .


4

CSV dosyasını Veri Tablosuna aktarmanız gereken firmalar

Sonra SQLBulkCopy kullanarak toplu satır ekleyebilirsiniz

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);
                }
            }
        }
    }
}

BulkCopy sınıfları etrafında belki daha kullanıcı dostu bir ambalajcı busybulkcopy.codeplex.com
busytools

3

İşte nasıl çözeceğim:

  1. CSV Dosyanızı excel'de XLS Sayfası olarak kaydedin (Bunu yaparak sınırlayıcılar hakkında endişelenmenize gerek kalmaz. Excel'in elektronik tablo biçimi bir tablo olarak okunacak ve doğrudan bir SQL Tablosuna aktarılacaktır)

  2. SSIS Kullanarak Dosyayı İçe Aktarın

  3. Aradığınız verileri atlamak / değiştirmek için içe aktarma yöneticisine bir Özel Komut Dosyası yazın. (Veya kaldırmak istediğiniz verileri incelemek için bir ana komut dosyası çalıştırın)

İyi şanslar.


3
Downvote: XLS dosyalarını SSIS ile içe aktarmak korkunç. SSIS, Excel verilerinin veri türlerini tahmin etmeye çalışacaktır, ancak yanlış tahmin edebilir ve bu konuda yapabileceğiniz hiçbir şey yoktur. CSV kullanmak çok daha iyi.
NReilingh

Eh, ben de csv öneririm, ama OP senaryosunu okuduysanız, özellikle xls sayfalarıyla ilgili bir sorun olmayan sınırlayıcılarla bazı özel senaryolar vardı. Genellikle bu gibi özel durum senaryoları kapsamlı bir çözüm gerektirmez, ancak verileri koruyan bir düzeltme gerektirir. Dosyayı yüklerken SSIS, kaynak ve hedef tablolar arasındaki veri eşlemesini seçmenize izin verir, bu da tekrar çaba harcamalarını kolaylaştırır. Bu yüzden bu yöntem hızlı bir saldırı olarak önerildi.
Zee

1
SSIS zaten CSV metin sınırlayıcılarını işleyebilir. Yine de SSIS kullanıyorsanız, CSV'nizi bir XLS olarak kaydetme zahmetine girmek, ilk önce bana sebepsiz yere potansiyel kırılma ekleyerek saldırıyor.
NReilingh

Ayrıca, düzenli olarak Excel için çok büyük CSV dosyalarım var.
Auspex

3

SQL içe aktarma sihirbazını kullanmadığından adımlar aşağıdaki gibi olacaktır:

resim açıklamasını buraya girin

  1. Veri almak için seçenek görevlerinde veritabanına sağ tıklayın ,

  2. Sihirbaz açıldıktan sonra, ima edilecek veri türünü seçiyoruz. Bu durumda,

Düz dosya kaynağı

CSV dosyasını seçiyoruz, CSV'deki tabloların veri türünü yapılandırabilirsiniz, ancak CSV'den getirmek en iyisidir.

  1. İleri'yi tıklayın ve son seçenekte

SQL istemcisi

Kimlik doğrulama türümüze bağlı olarak, onu seçiyoruz, bu yapıldıktan sonra çok önemli bir seçenek geliyor.

  1. CSV'de tablonun kimliğini tanımlayabiliriz (CSV sütunlarının tablodaki alanlarla aynı olarak adlandırılması önerilir). Eşlemeleri Düzenle seçeneğinde, her tablonun önizlemesini e-tablonun sütunuyla görebiliriz, sihirbazın kimliği varsayılan olarak eklemesini istiyorsak seçeneği işaretlemeyiz.

Kimlik eklemeyi etkinleştir

(genellikle 1'den başlamıyor), bunun yerine CSV'de kimliğe sahip bir sütun varsa, etkinleştirme kimlik eklemesini seçeriz, sonraki adım sihirbazı sonlandırmaktır, değişiklikleri burada inceleyebiliriz.

Öte yandan, aşağıdaki pencerede uyarılar veya uyarılar gelebilir , ideal olan bunu görmezden gelmektir, ancak hata bırakırlarsa dikkat etmek gerekir.

Bu bağlantının resimleri var .


0

Excel'i önce Excel'i açıp DATA'ya gidip TXT Dosyasından içe aktarın, 0 önek değerini koruyacak csv uzantısını seçin ve excel önde 0'ı başka türlü düşürmeyeceğinden bu sütunu TEXT olarak kaydedin (Excel'i çift tıklamayın) 0 [sıfır] ile başlayan bir alanda sayısal verileriniz varsa Excel ile açmak için). Ardından Sekmeyle Ayrılmış Metin dosyası olarak kaydedin. Excel'e içe aktarırken, GENEL, METİN, vb. Olarak kaydetme seçeneği elde edersiniz .. METİN'i seçin, böylece Şirketiniz, LLC gibi bir alandaki bir dizenin ortasındaki alıntılar da korunur ...

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

Keşke FORMAT ve Fieldquote işlevini kullanabilseydim, ancak SSMS sürümümde desteklenmiyor gibi görünüyor


0

Kabul edilmiş bir cevap olduğunu biliyorum ama yine de, birinin sorununu çözmesine yardımcı olabilecek senaryomu paylaşmak istiyorum ARAÇLAR

  • ASP.NET
  • EF İLK KOD YAKLAŞIMI
  • ssms
  • EXCEL

SCENARIO i daha sonra Görünüm'de gösterilecek olan CSV biçimindeki veri kümesini yüklüyordum toplu yükü kullanmaya çalıştım ama BULK LOADkullandığım gibi yükleyemiyorum

FIELDTERMINATOR = ','

ve Excel hücresi de kullanıyordum , , aynı zamanda Flat file sourcedoğrudan kullanamadım çünkü Code-First Approachözellikleri daha sonra kullanmak zorunda kaldığım modelde değil, sadece SSMS DB'de yapıyordum.

ÇÖZÜM

  1. Düz dosya kaynağı kullandım ve CSV dosyasından DB tablosu yaptım ( SSMS'de DB'yi sağ tıklayın -> Düz Dosyayı İçe Aktar -> CSV yolunu seçin ve tüm ayarları belirtilen şekilde yapın )
  2. Visual Studio'da Model Sınıfı Yapıldı (Tüm veri türlerini ve adları sql'de yüklü CSV dosyasıyla aynı tutmalısınız)
  3. Add-MigrationNuGet paket konsolunda kullanma
  4. DB'yi güncelle

0

Bu yukarıdaki soruya kesin bir çözüm olmadığını biliyorum, ama benim için, ayrı bir sunucuda bulunan bir veritabanından veriyi yerelime kopyalamaya çalışırken bir kabus oldu .

Ben ilk tarafından bunu yapmaya çalışıyordum ihracat için Server veri CSV/txtve ardından içe benim yerel masaya.

Her iki çözüm: CSVSSMS Alma Verileri sihirbazını içe aktarmak veya kullanmak için sorguyu yazmakla her zaman hatalar üretiyordu (hatalar çok geneldi, ayrıştırma sorunu olduğunu söyleyerek). Ve ben özel bir şey yapmıyorum rağmen, sadece ihracat için CSVve daha sonra çalışırken ithal CSV yerele DB, hatalar hep vardı.

Haritalama bölümüne ve veri önizlemesine bakmaya çalışıyordum, ama her zaman büyük bir karmaşa vardı. Ve asıl sorunun table, içerdiği sütunlardan birinden geldiğini JSONve SQLayrıştırıcının buna yanlış davrandığını biliyorum.

Sonunda, farklı bir çözüm buldum ve başka birisinin benzer bir problemi olması durumunda bunu paylaşmak istiyorum.


Yaptığım şey, dış sunucuda Verme Sihirbazı'nı kullanmak.

Aynı işlemi tekrarlama adımları şunlardır:
1) Veritabanına sağ tıklayın veTasks -> Export Data...

2) Sihirbaz açıldığında, İleri'yi seçin ve "Veri Kaynağı:" yerine "SQL Server Yerel İstemcisi" ni seçin.

resim açıklamasını buraya girin

Harici Sunucu durumunda, büyük olasılıkla "Kimlik Doğrulama Modu:" için "SQL Server Kimlik Doğrulamasını Kullan" ı seçmeniz gerekecektir.

3) İleri düğmesine bastıktan sonra , Hedef'i seçmeniz gerekir .
Bunun için tekrar "SQL Server Native Client" ı seçin.
Bu kez yerel (veya başka bir harici DB) sağlayabilirsiniz DB.

resim açıklamasını buraya girin

4) İleri düğmesine bastıktan sonra, tüm tabloyu birinden diğerine kopyalamak DBveya kopyalanacak kesin verileri belirlemek için sorguyu yazmak için iki seçeneğiniz vardır . Benim durumumda, tüm tabloya ihtiyacım yoktu (çok büyüktü), ama sadece bir kısmı, bu yüzden "Aktarılacak verileri belirtmek için bir sorgu yaz" ı seçtim.

resim açıklamasını buraya girin

Sihirbaz'a geçmeden önce sorguyu ayrı bir sorgu düzenleyicisine yazmayı ve test etmeyi öneririm.

5) Ve son olarak, verilerin seçileceği hedef tabloyu belirtmeniz gerekir.

resim açıklamasını buraya girin

Verileri dışa aktarma konusunda hatalarınız varsa veya verilerden emin değilseniz ve tam olarak istediğiniz tabloya geçmeden önce daha fazla analiz etmek istiyorsanız, bunu bir [dbo].[Query]veya özel Tablead olarak bırakmanızı öneririm .

Ve şimdi İleri / Son düğmelerine basarak doğrudan Sihirbazın sonuna gidin .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.