Importa file CSV in SQL Server


186

Sto cercando aiuto per importare un .csvfile in SQL Server usando BULK INSERTe ho alcune domande di base.

Problemi:

  1. I dati del file CSV possono contenere ,(virgola) tra (Esempio: descrizione), quindi come posso fare l'importazione gestendo questi dati?

  2. Se il client crea il CSV da Excel, i dati che contengono una virgola sono racchiusi tra ""virgolette (virgolette doppie) [come nell'esempio seguente], quindi in che modo l'importazione può gestirlo?

  3. Come possiamo rilevare se alcune righe contengono dati errati, che importa salta? (importa salta le righe che non sono importabili)

Ecco il CSV di esempio con intestazione:

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.

E istruzione SQL da importare:

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
)

Può essere SSMS: come importare (copiare / incollare) i dati da Excel può aiutare (se non si desidera utilizzare BULK NSERTo non si dispone delle autorizzazioni per esso).
Denis

Risposte:


169

Importazione CSV basata su SQL Server

1) I dati del file CSV possono contenere ,(virgola) tra (Esempio: descrizione), quindi come posso fare l'importazione gestendo questi dati?

Soluzione

Se stai usando ,(virgola) come delimitatore, non c'è modo di distinguere tra una virgola come terminatore di campo e una virgola nei tuoi dati. Vorrei usare un diverso FIELDTERMINATORcome ||. Il codice sarebbe simile e questo gestirà perfettamente virgola e barra singola.

2) Se il client crea il CSV da Excel, i dati che contengono una virgola sono racchiusi tra " ... "virgolette (virgolette doppie) [come nell'esempio seguente], quindi come può gestirlo l'importazione?

Soluzione

Se si utilizza l'inserimento BULK, non è possibile gestire virgolette doppie, i dati verranno inseriti con virgolette doppie nelle righe. dopo aver inserito i dati nella tabella è possibile sostituire quelle doppie virgolette con ' '.

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

3) Come possiamo tenere traccia se alcune righe contengono dati errati, quale importazione salta? (l'importazione salta le righe che non sono importabili)?

Soluzione

Per gestire le righe che non sono caricate nella tabella a causa di dati o formati non validi, è possibile gestirle utilizzando la proprietà ERRORFILE , specificare il nome del file di errore, scriverà le file con errore nel file di errore. il codice dovrebbe apparire come.

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
Grazie per l'aiuto. Reg the Solution # 1: possiamo creare || file di valori separato da Excel? Perché circa il 20% dei file di origine viene creato utilizzando Excel dal client.
Prabhat,

@Prabhat Come stai caricando i file Excel in SQL Server?
Vishwanath Dalvi,

Questi non sono file Excel che sto caricando. Il client utilizza Excel per creare file .CSV (per il 20% dei dati di origine importati dalla nostra applicazione). E stavo chiedendo se creiamo file CSV usando Excel come possiamo avere || come separatore del valore di colonna?
Prabhat,

Se hai influenza su come il client crea file CSV da Excel, puoi insegnare loro come impostare il carattere separatore in Excel (e bene, non è più un file separato "virgola", sarebbe pipe (|) separato, ad esempio, visti i cerchi che stai saltando per questo, e se hai SSIS, ti consiglio di controllarlo. Le versioni di SQL Server 2012 e successive hanno un designer SSIS molto robusto (anche in VS 2012 e versioni successive) che abilita il tuo client a inviarti semplicemente i file Excel invece di CSV.
qxotk,

Non sono sicuro che sia del tutto accurato. È possibile gestire le doppie virgolette in SQL Bulk Insert. C'è un overflow dello stack su questo argomento e si possono usare i file di formato per insegnare agli inserti collettivi vari delimitatori. stackoverflow.com/questions/25726385/... advancesharp.com/blog/1083/...
DtechNet

33

Devi prima creare una tabella nel tuo database in cui importerai il file CSV. Dopo aver creato la tabella, attenersi alla seguente procedura.

• Accedere al database utilizzando SQL Server Management Studio

• Fare clic con il tasto destro sul database e selezionare Tasks -> Import Data...

• Fare clic sul Next >pulsante

• Per l'origine dati, selezionare Flat File Source. Quindi utilizzare il pulsante Sfoglia per selezionare il file CSV. Trascorrere del tempo a configurare il modo in cui si desidera importare i dati prima di fare clic sul Next >pulsante.

• Per Destinazione, selezionare il provider di database corretto (ad es. Per SQL Server 2012, è possibile utilizzare SQL Server Native Client 11.0). Inserisci il nome del server. Controlla il Use SQL Server Authenticationpulsante di opzione . Immettere il nome utente, la password e il database prima di fare clic sul Next >pulsante.

• Nella finestra Seleziona tabelle e viste di origine, è possibile modificare i mapping prima di fare clic sul Next >pulsante.

• Selezionare la Run immediatelycasella di controllo e fare clic sul Next >pulsante.

• Fare clic sul Finishpulsante per eseguire il pacchetto.

Quanto sopra è stato trovato su questo sito Web (l'ho usato e testato):



1
Non è necessario pre-creare la tabella, può essere creata durante il processo di importazione
bside

1
Adoro il fatto che tu abbia appena tagliato e incollato da una pagina Web con la linea oh-così-utile "Trascorrere del tempo a configurare come si desidera importare i dati" . Era tutto quello che stavo cercando: non riesco a configurarlo affatto!
Auspex,

Oh, e "Controlla il pulsante di opzione Usa autenticazione di SQL Server" è sbagliato, poiché potresti voler utilizzare l'autenticazione di Windows. È quello che funziona per te.
Auspex,

grazie trovato una procedura passo passo con le immagini per implementare la procedura sopra, vale la pena dare un'occhiata: qawithexperts.com/article/sql/…
user3559462

23

2) Se il client crea il CSV da Excel allora i dati che hanno una virgola sono racchiusi tra "..." (virgolette doppie) [come nell'esempio seguente], quindi come può gestirlo l'importazione?

Dovresti usare FORMAT = 'CSV', FIELDQUOTE = '"' opzioni:

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
Nota che l'identificatore FORMAT è disponibile solo da SQL Server 2017.
kristianp

13

Il modo migliore, più rapido e più semplice per risolvere la virgola nel problema dei dati è utilizzare Excel per salvare un file separato da virgola dopo aver impostato le impostazioni del separatore di elenco di Windows su qualcosa di diverso da una virgola (come una pipe). Questo genererà quindi un file separato da pipe (o qualunque altra cosa) che potrai quindi importare. Questo è descritto qui .


4

Prima devi importare il file CSV nella tabella dei dati

Quindi è possibile inserire righe di massa utilizzando 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);
                }
            }
        }
    }
}

un wrapper forse più user-friendly attorno alle classi BulkCopy busybulkcopy.codeplex.com
busytools

3

Ecco come lo risolverei:

  1. Basta salvare il file CSV come foglio XLS in Excel (In questo modo, non dovresti preoccuparti dei delimitatori. Il formato del foglio di calcolo di Excel verrà letto come una tabella e importato direttamente in una tabella SQL)

  2. Importa il file usando SSIS

  3. Scrivi uno script personalizzato nel gestore delle importazioni per omettere / modificare i dati che stai cercando (oppure esegui uno script principale per esaminare i dati che desideri rimuovere)

In bocca al lupo.


3
Downvote: l'importazione di file XLS con SSIS è terribile. SSIS proverà a indovinare i tipi di dati dei dati di Excel, ma può indovinare e non c'è niente che tu possa fare al riguardo. Molto meglio usare CSV.
NReilingh,

Bene, suggerirei anche CSV, ma se avessi letto lo scenario del PO, aveva alcuni scenari speciali specialmente con i delimitatori che non sono un problema con i fogli xls. Solitamente scenari di casi speciali come questi non richiedono una soluzione estesa, ma una correzione che preserva i dati. Durante il caricamento del file, SSIS consente di scegliere la mappatura dei dati tra le tabelle di origine e di destinazione, il che semplifica ulteriormente lo sforzo. Ecco perché questo metodo è stato suggerito come un trucco rapido.
Zee,

1
SSIS è già in grado di gestire i delimitatori di testo CSV. Se stai usando SSIS comunque, andare nel guaio del salvataggio del tuo CSV come XLS mi colpisce solo come aggiungere potenziali rotture senza motivo.
NReilingh,

Inoltre, di solito ho file CSV troppo grandi per Excel.
Auspex,

3

Poiché non utilizzano la procedura guidata di importazione SQL, i passaggi sarebbero i seguenti:

inserisci qui la descrizione dell'immagine

  1. Fare clic con il tasto destro sul database nelle attività opzionali per importare dati,

  2. Una volta aperta la procedura guidata , selezioniamo il tipo di dati da implicare. In questo caso sarebbe il

Origine file piatta

Selezioniamo il file CSV, puoi configurare il tipo di dati delle tabelle nel CSV, ma è meglio portarlo dal CSV.

  1. Fai clic su Avanti e seleziona nell'ultima opzione disponibile

Client SQL

A seconda del nostro tipo di autenticazione, lo selezioniamo, una volta fatto ciò, arriva un'opzione molto importante.

  1. Possiamo definire l'id della tabella nel CSV (si consiglia di chiamare le colonne del CSV come i campi nella tabella). Nell'opzione Modifica mappature possiamo vedere l'anteprima di ogni tabella con la colonna del foglio di calcolo, se vogliamo che la procedura guidata inserisca l'id per impostazione predefinita, lasciamo l'opzione deselezionata.

Abilita inserimento ID

(di solito non a partire da 1), invece se abbiamo una colonna con l'id nel CSV selezioniamo l'abilitazione dell'inserimento dell'id, il passo successivo è terminare la procedura guidata, possiamo rivedere qui le modifiche.

D'altra parte, nella finestra che segue potrebbero essere presenti avvisi o avvisi l'ideale è ignorarlo, solo se si lasciano errori è necessario prestare attenzione.

Questo link ha immagini .


0

Importa il file in Excel aprendo prima Excel, quindi andando in DATA, importando da TXT File, scegli l'estensione csv che manterrà 0 valori prefissati e salva quella colonna come TESTO perché Excel lascerà cadere lo 0 iniziale altrimenti (NON fare doppio clic per aprirsi con Excel se si hanno dati numerici in un campo che inizia con 0 [zero]). Quindi salva semplicemente come file di testo delimitato da tabulazioni. Quando stai importando in Excel ottieni un'opzione per salvare come GENERALE, TESTO, ecc. Scegli TESTO in modo che le virgolette nel mezzo di una stringa in un campo come YourCompany, LLC vengano conservate anche ...

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

Vorrei poter utilizzare la funzionalità FORMAT e Fieldquote ma che non sembra essere supportato nella mia versione di SSMS


0

So che ci sono risposte accettate ma, comunque, voglio condividere il mio scenario che forse aiuta qualcuno a risolvere il loro problema STRUMENTI

  • ASP.NET
  • CODICE EF-PRIMO APPROCCIO
  • SSMS
  • ECCELLERE

SCENARIO Stavo caricando il set di dati che è in formato CSV che sarebbe stato successivamente mostrato nella vista Ho provato a utilizzare il caricamento di massa ma non sono riuscito a caricare come BULK LOADstava usando

FIELDTERMINATOR = ','

e la cella di Excel utilizzava , comunque, inoltre non potevo usare Flat file sourcedirettamente perché stavo usando Code-First Approache facendo quel modello creato solo nel database SSMS, non nel modello dal quale dovevo usare le proprietà in seguito.

SOLUZIONE

  1. Ho usato la sorgente di file flat e ho creato una tabella DB dal file CSV ( tasto destro del mouse DB in SSMS -> Importa file piatto -> seleziona il percorso CSV ed esegui tutte le impostazioni come indicato )
  2. Classe del modello creata in Visual Studio (DEVI MANTENERE tutti i tipi di dati e i nomi uguali a quelli del file CSV caricato in sql)
  3. utilizzare Add-Migrationnella console del pacchetto NuGet
  4. Aggiorna DB

0

So che questa non è la soluzione esatta alla domanda sopra, ma per me è stato un incubo quando stavo cercando di copiare i dati da un database situato in un server separato nel mio locale.

Stavo cercando di farlo esportando prima i dati dal server CSV/txte quindi importandoli nella mia tabella locale.

Entrambe le soluzioni: scrivere la query per importare CSVo utilizzare la procedura guidata di importazione dei dati SSMS ha sempre prodotto errori (gli errori erano molto generali, dicendo che c'è un problema di analisi). E anche se non stavo facendo niente di speciale, solo esportare a CSVe poi cercando di importare CSV al localeDB , gli errori ci sono sempre stati.

Stavo cercando di esaminare la sezione di mappatura e l'anteprima dei dati, ma c'era sempre un grande casino. E so che il problema principale veniva da una delle tablecolonne, che conteneva JSONe il SQLparser lo trattava in modo errato.

Quindi alla fine, ho trovato una soluzione diversa e voglio condividerla nel caso in cui qualcun altro abbia un problema simile.


Quello che ho fatto è che ho usato la procedura guidata di esportazione sul server esterno.

Ecco i passaggi per ripetere lo stesso processo:
1) Fare clic con il tasto destro sul database e selezionareTasks -> Export Data...

2) Quando si aprirà la procedura guidata, selezionare Avanti e al posto di "Origine dati:" selezionare "SQL Server Native Client".

inserisci qui la descrizione dell'immagine

Nel caso di un server esterno dovrai probabilmente scegliere "Usa autenticazione di SQL Server" per la "Modalità di autenticazione:".

3) Dopo aver premuto Next , devi selezionare il Destionation .
A tale scopo, selezionare nuovamente "SQL Server Native Client".
Questa volta puoi fornire il tuo locale (o qualche altro esterno DB) DB.

inserisci qui la descrizione dell'immagine

4) Dopo aver premuto il pulsante Avanti, sono disponibili due opzioni per copiare l'intera tabella da una DBall'altra o scrivere la query per specificare i dati esatti da copiare. Nel mio caso, non avevo bisogno dell'intera tabella (era troppo grande), ma solo di una parte di essa, quindi ho scelto "Scrivi una query per specificare i dati da trasferire".

inserisci qui la descrizione dell'immagine

Suggerirei di scrivere e testare la query su un editor di query separato prima di passare alla procedura guidata.

5) Infine, è necessario specificare la tabella di destinazione in cui verranno selezionati i dati.

inserisci qui la descrizione dell'immagine

Suggerisco di lasciarlo come [dbo].[Query]o un Tablenome personalizzato nel caso in cui si verificassero errori nell'esportazione dei dati o se non si è sicuri dei dati e si desidera analizzarli ulteriormente prima di passare alla tabella esatta desiderata.

E ora vai dritto alla fine della procedura guidata premendo i pulsanti Avanti / Fine .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.