Impor file CSV ke SQL Server

186

Saya mencari bantuan untuk mengimpor .csvfile ke dalam SQL Server menggunakan BULK INSERTdan saya punya beberapa pertanyaan dasar.

Masalah:

  1. Data file CSV mungkin memiliki ,(koma) di antaranya (Contoh: deskripsi), jadi bagaimana saya dapat membuat impor menangani data ini?

  2. Jika klien membuat CSV dari Excel maka data yang memiliki koma terlampir di dalam ""(tanda kutip ganda) [seperti contoh di bawah ini] jadi bagaimana cara impor dapat menangani ini?

  3. Bagaimana cara melacak jika beberapa baris memiliki data buruk, yang impornya dilewati? (apakah impor melompati baris yang tidak dapat diimpor)

Berikut adalah contoh CSV dengan tajuk:

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.

Dan pernyataan SQL untuk mengimpor:

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
)
Prabhat
sumber
Mungkin SSMS: Cara mengimpor (Salin / Tempel) data dari excel dapat membantu (Jika Anda tidak ingin menggunakan BULK NSERTatau tidak memiliki izin untuk itu).
Denis

Jawaban:

169

Impor SQL Server CSV Berbasis

1) Data file CSV mungkin memiliki ,(koma) di antaranya (Contoh: deskripsi), jadi bagaimana saya dapat membuat impor menangani data ini?

Larutan

Jika Anda menggunakan ,(koma) sebagai pembatas, maka tidak ada cara untuk membedakan antara koma sebagai terminator bidang dan koma dalam data Anda. Saya akan menggunakan yang berbeda FIELDTERMINATORseperti ||. Kode akan terlihat dan ini akan menangani koma dan slash tunggal dengan sempurna.

2) Jika klien membuat csv dari excel maka data yang memiliki koma disertakan dalam " ... "(tanda kutip ganda) [seperti contoh di bawah ini] jadi bagaimana cara impor dapat menangani ini?

Larutan

Jika Anda menggunakan BULK masukkan maka tidak ada cara untuk menangani tanda kutip ganda, data akan dimasukkan dengan tanda kutip ganda ke dalam baris. setelah memasukkan data ke dalam tabel Anda bisa mengganti tanda kutip ganda itu dengan ' '.

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

3) Bagaimana kita melacak jika beberapa baris memiliki data yang buruk, yang mengimpor dilewati? (apakah impor melompati baris yang tidak dapat diimpor)?

Larutan

Untuk menangani baris yang tidak dimuat ke dalam tabel karena data atau format tidak valid, dapat ditangani menggunakan properti ERRORFILE , tentukan nama file kesalahan, itu akan menulis baris memiliki kesalahan untuk file kesalahan. kode akan terlihat seperti.

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
    )
Vishwanath Dalvi
sumber
1
Terima kasih untuk bantuannya. Reg the Solution # 1: Bisakah kita membuat || file nilai terpisah dari Excel? Karena sekitar 20% dari file sumber dibuat menggunakan Excel oleh klien.
Prabhat
@ Prabhat Bagaimana Anda memuat file Excel ke SQL Server?
Vishwanath Dalvi
Ini bukan file Excel yang saya muat. Klien menggunakan Excel untuk membuat file .CSV (untuk 20% dari sumber data yang diimpor aplikasi kami). Dan saya bertanya apakah kita membuat file csv menggunakan Excel bagaimana kita bisa memiliki || sebagai pemisah nilai kolom?
Prabhat
Jika Anda memiliki pengaruh pada bagaimana klien membuat file CSV dari Excel, Anda bisa mengajari mereka cara mengatur karakter pemisah di Excel (dan yah, itu bukan lagi file yang dipisahkan "koma", itu akan dipisahkan dengan pipa (|), Sebagai contoh, mengingat lingkaran yang Anda lompati untuk ini, dan jika Anda memiliki SSIS - Saya sarankan Anda memeriksanya. Versi SQL Server 2012 dan kemudian memiliki desainer SSIS yang sangat kuat (juga di VS 2012 dan yang lebih baru) yang akan aktifkan klien Anda untuk mengirimi Anda file excel alih-alih csv.
qxotk
Saya tidak yakin ini sepenuhnya akurat. Anda dapat berurusan dengan tanda kutip ganda dalam SQL Bulk Insert. Ada Stack Overflow pada topik ini dan seseorang dapat menggunakan file format untuk mengajarkan Bulk Insert berbagai pembatas. stackoverflow.com/questions/25726385/… advancesharp.com/blog/1083/…
DtechNet
33

Pertama-tama Anda perlu membuat tabel di basis data di mana Anda akan mengimpor file CSV. Setelah tabel dibuat, ikuti langkah-langkah di bawah ini.

• Masuk ke database Anda menggunakan SQL Server Management Studio

• Klik kanan pada database Anda dan pilih Tasks -> Import Data...

• Klik Next >tombol

• Untuk Sumber Data, pilih Flat File Source. Kemudian gunakan tombol Browse untuk memilih file CSV. Luangkan waktu untuk mengonfigurasikan bagaimana Anda ingin data diimpor sebelum mengklik Next >tombol.

• Untuk Tujuan, pilih penyedia database yang benar (misalnya untuk SQL Server 2012, Anda dapat menggunakan SQL Server Native Client 11.0). Masukkan nama Server. Periksa Use SQL Server Authenticationtombol radio. Masukkan nama pengguna, kata sandi, dan basis data sebelum mengklik Next >tombol.

• Pada jendela Select Source Tables and Views, Anda dapat Mengedit Pemetaan sebelum mengklik Next >tombol.

• Centang Run immediatelykotak dan klik Next >tombol.

• Klik Finishtombol untuk menjalankan paket.

Di atas ditemukan di situs web ini (saya telah menggunakannya dan diuji):

Zd8n8k
sumber
30
Alangkah baiknya jika Anda memberikan atribusi ke halaman tempat Anda menyalin / menempelkan jawaban ini dari ...
SierraOscar
1
Tidak perlu melakukan pra-buat tabel, itu dapat dibuat selama proses impor
bides
1
Saya suka bahwa Anda baru saja memotong & menempel dari halaman web dengan baris yang sangat berguna "Luangkan waktu untuk mengonfigurasikan bagaimana Anda ingin data diimpor" . Itu semua yang saya cari: Sepertinya saya tidak bisa mengkonfigurasinya sama sekali!
Auspex
Oh, dan "Periksa tombol radio Gunakan SQL Server Authentication" salah, karena Anda mungkin ingin menggunakan Windows Authentication. Apapun yang berhasil untuk Anda.
Auspex
terima kasih menemukan prosedur langkah demi langkah dengan gambar untuk menerapkan prosedur di atas, patut dilihat: qawithexperts.com/article/sql/…
user3559462
23

2) Jika klien membuat csv dari excel maka data yang memiliki koma terlampir dalam "..." (tanda kutip ganda) [seperti contoh di bawah ini] jadi bagaimana cara impor dapat menangani ini?

Anda harus menggunakan opsi FORMAT = 'CSV', FIELDQUOTE = '"':

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
)
Oleg
sumber
1
Perhatikan bahwa specifier FORMAT hanya tersedia sejak SQL Server 2017.
kristianp
13

Cara terbaik, tercepat dan termudah untuk menyelesaikan koma dalam masalah data adalah dengan menggunakan Excel untuk menyimpan file yang dipisahkan koma setelah menetapkan pengaturan pemisah daftar Windows ke sesuatu selain koma (seperti pipa). Ini kemudian akan menghasilkan pipa (atau apa pun) file terpisah untuk Anda yang kemudian dapat Anda impor. Ini dijelaskan di sini .

Sachin Kainth
sumber
4

Pertama, Anda perlu mengimpor file CSV ke dalam Tabel Data

Kemudian Anda bisa memasukkan baris massal menggunakan 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);
                }
            }
        }
    }
}
kombsh
sumber
pembungkus mungkin lebih ramah pengguna di sekitar kelas BulkCopy busybulkcopy.codeplex.com
busytools
3

Inilah cara saya akan menyelesaikannya:

  1. Cukup Simpan File CSV Anda sebagai Lembar XLS di excel (Dengan Melakukan itu, Anda tidak perlu khawatir tentang pembatas. Format spreadsheet Excel akan dibaca sebagai tabel dan diimpor langsung ke Tabel SQL)

  2. Impor File Menggunakan SSIS

  3. Tulis Skrip Kustom di manajer impor untuk menghilangkan / memodifikasi data yang Anda cari. (Atau jalankan skrip master untuk memeriksa data yang ingin Anda hapus)

Semoga berhasil.

Zee
sumber
3
Downvote: Mengimpor file XLS dengan SSIS sangat buruk. SSIS akan mencoba menerka tipe data dari data Excel, tetapi dapat menebak salah dan tidak ada yang dapat Anda lakukan tentang itu. Jauh lebih baik menggunakan CSV.
NReilingh
Yah, saya sarankan csv juga, tetapi jika Anda telah membaca skenario OP, ia memiliki beberapa skenario khusus terutama dengan pembatas yang tidak menjadi masalah dengan lembar xls. Biasanya skenario kasus khusus seperti ini tidak memerlukan solusi yang luas, tetapi perbaikan yang menjaga data. Saat mengunggah file, SSIS memungkinkan Anda memilih pemetaan data antara tabel sumber dan tujuan yang lagi, memudahkan upaya yang terlibat. Itulah sebabnya metode ini disarankan sebagai peretasan cepat.
Zee
1
SSIS sudah dapat menangani pembatas teks CSV. Jika Anda menggunakan SSIS, pergi ke masalah menyimpan CSV Anda sebagai XLS pertama hanya menganggap saya menambahkan potensi kerusakan tanpa alasan.
NReilingh
Juga, saya secara rutin memiliki file CSV yang terlalu besar untuk Excel.
Auspex
3

Karena mereka tidak menggunakan panduan impor SQL, langkah-langkahnya adalah sebagai berikut:

masukkan deskripsi gambar di sini

  1. Klik kanan pada database di opsi tugas untuk mengimpor data,

  2. Setelah wizard terbuka, kami memilih jenis data yang akan tersirat. Dalam hal ini akan menjadi

Sumber file datar

Kami memilih file CSV, Anda dapat mengonfigurasi tipe data tabel di CSV, tetapi yang terbaik adalah membawanya dari CSV.

  1. Klik Berikutnya dan pilih di opsi terakhir itu

Klien SQL

Tergantung pada jenis otentikasi kami, kami memilihnya, setelah ini selesai, opsi yang sangat penting datang.

  1. Kita dapat mendefinisikan id tabel dalam CSV (disarankan agar kolom CSV harus sama dengan kolom pada tabel). Dalam opsi Edit Pemetaan, kita dapat melihat pratinjau setiap tabel dengan kolom spreadsheet, jika kita ingin wisaya memasukkan id secara default, kita membiarkan opsi tidak dicentang.

Aktifkan penyisipan id

(biasanya tidak dimulai dari 1), sebagai gantinya jika kami memiliki kolom dengan id di CSV kami memilih insert memungkinkan id, langkah selanjutnya adalah mengakhiri wizard, kami dapat meninjau perubahan di sini.

Di sisi lain, di jendela berikut mungkin muncul peringatan, atau peringatan yang ideal adalah mengabaikan hal ini, hanya jika mereka meninggalkan kesalahan diperlukan untuk memperhatikan.

Tautan ini memiliki gambar .

jarvis24
sumber
0

Impor file ke Excel dengan terlebih dahulu membuka excel, lalu pergi ke DATA, impor dari File TXT, pilih ekstensi csv yang akan mempertahankan 0 nilai awalan, dan simpan kolom itu sebagai TEXT karena excel akan menjatuhkan 0 yang memimpin sebelumnya (JANGAN klik dua kali klik untuk membuka dengan Excel jika Anda memiliki data numerik dalam bidang yang dimulai dengan 0 [nol]). Kemudian simpan saja sebagai file Teks Yang Dibatasi Tab. Ketika Anda mengimpor ke excel, Anda mendapatkan opsi untuk menyimpan sebagai UMUM, TEKS, dll. Pilih TEXT sehingga kutipan di tengah-tengah string dalam bidang seperti YourCompany, LLC juga disimpan ...

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

Saya berharap saya bisa menggunakan fungsionalitas FORMAT dan Fieldquote tapi itu tampaknya tidak didukung dalam versi SSMS saya

Steve Yo
sumber
0

Saya tahu bahwa ada jawaban yang diterima tetapi masih, saya ingin membagikan skenario saya yang mungkin membantu seseorang untuk memecahkan ALAT masalah mereka

  • ASP.NET
  • PENDEKATAN EF CODE-FIRST
  • SSMS
  • UNGGUL

SKENARIO saya sedang memuat dataset yang dalam format CSV yang kemudian ditampilkan pada tampilan saya mencoba menggunakan beban massal tetapi saya tidak dapat memuat seperti BULK LOADmenggunakan

FIELDTERMINATOR = ','

dan sel Excel juga menggunakan , , saya juga tidak bisa menggunakan Flat file sourcesecara langsung karena saya menggunakan Code-First Approachdan melakukan itu hanya membuat model dalam SSMS DB, bukan dalam model dari mana saya harus menggunakan properti nanti.

LARUTAN

  1. Saya menggunakan sumber file datar dan membuat tabel DB dari file CSV ( Klik kanan DB di SSMS -> Import Flat FIle -> pilih jalur CSV dan lakukan semua pengaturan seperti yang diarahkan )
  2. Membuat Model Kelas dalam Visual Studio (Anda HARUS MENJAGA semua tipe data dan nama yang sama dengan file CSV yang dimuat dalam sql)
  3. gunakan Add-Migrationdi konsol paket NuGet
  4. Perbarui DB
Bunglon
sumber
0

Saya tahu ini bukan solusi tepat untuk pertanyaan di atas, tetapi bagi saya, itu adalah mimpi buruk ketika saya mencoba untuk Menyalin data dari satu database yang terletak di server terpisah ke lokal saya.

Saya mencoba melakukan itu dengan pertama-tama mengekspor data dari Server ke CSV/txtdan kemudian mengimpornya ke tabel lokal saya.

Kedua solusi: dengan menuliskan kueri untuk mengimpor CSVatau menggunakan wizard Impor Data SSMS selalu menghasilkan kesalahan (kesalahan sangat umum, mengatakan bahwa ada masalah parsing). Dan meskipun saya tidak melakukan sesuatu yang istimewa, hanya ekspor ke CSVdan kemudian mencoba untuk mengimpor CSV ke lokal DB, kesalahan selalu ada.

Saya mencoba melihat bagian pemetaan dan pratinjau data, tetapi selalu ada kekacauan besar. Dan saya tahu masalah utama berasal dari salah satu tablekolom, yang berisi JSONdan SQLparser memperlakukannya dengan salah.

Jadi akhirnya, saya menemukan solusi yang berbeda dan ingin membaginya jika ada orang lain yang memiliki masalah serupa.


Apa yang saya lakukan adalah saya telah menggunakan Wisaya Ekspor pada Server eksternal.

Berikut adalah langkah-langkah untuk mengulangi proses yang sama:
1) Klik kanan pada database dan pilihTasks -> Export Data...

2) Ketika Wizard akan terbuka, pilih Next dan di tempat "Sumber Data:" pilih "SQL Server Native Client".

masukkan deskripsi gambar di sini

Dalam hal Server eksternal Anda kemungkinan besar harus memilih "Gunakan SQL Server Authentication" untuk "Mode Otentikasi:".

3) Setelah menekan Next , Anda harus memilih Destionation .
Untuk itu, pilih lagi "SQL Server Native Client".
Kali ini Anda dapat menyediakan lokal Anda (atau eksternal lainnya DB) DB.

masukkan deskripsi gambar di sini

4) Setelah menekan tombol Next, Anda memiliki dua opsi untuk menyalin seluruh tabel dari satu DBke yang lain atau menuliskan kueri untuk menentukan data yang tepat untuk disalin. Dalam kasus saya, saya tidak perlu seluruh tabel (terlalu besar), tetapi hanya sebagian saja, jadi saya telah memilih "Tulis kueri untuk menentukan data yang akan ditransfer".

masukkan deskripsi gambar di sini

Saya akan menyarankan untuk menulis dan menguji kueri pada editor kueri yang terpisah sebelum pindah ke Wizard.

5) Dan akhirnya, Anda perlu menentukan tabel tujuan tempat data akan dipilih.

masukkan deskripsi gambar di sini

Saya sarankan untuk membiarkannya sebagai [dbo].[Query]atau beberapa Tablenama khusus untuk berjaga-jaga jika Anda akan memiliki kesalahan dalam mengekspor data atau jika Anda tidak yakin tentang data dan ingin menganalisis lebih lanjut sebelum pindah ke tabel yang tepat yang Anda inginkan.

Dan sekarang langsung ke akhir Wizard dengan menekan tombol Next / Finish .

Arsen Khachaturyan
sumber