File csv

venerdì 05 ottobre 2007 - 19.05

gae58 Profilo | Senior Member

salve,

ho iun file csv e vorrei importarlo in una tabella di MS Sql express.

Qualcuno mi può dire come si fa?

grazie
Gaetano

lbenaglia Profilo | Guru

>ho iun file csv e vorrei importarlo in una tabella di MS Sql
>express.
>
>Qualcuno mi può dire come si fa?

Ciao Gaetano,

puoi utilizzare 2 strade:

- Il comando BULK INSERT
- L'utility command-line bcp.exe

Entrambi utilizzano le API di Bulk Copy che permettono di eseguire operazioni di I/O su/da file system in modo estremamente efficiente.
Sui Books Online troverai tutti i dettagli e sul ng microsoft.public.it.sql ci sono valanghe di esempi

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

ciao Lorenzo ho seguito il tuo esempio ed ho utilizzatoil comando che mi hai indicato.

L'importazione, però non l'ho potuta fare completa, in quanto la tabella MQ SQL ha un campo progressivo con identity su cui mi ha dato l'errore (non è presente nel file csv) e su un campo che nel dbf è numerico 2, mentre in sql è int.

Qualche suggerimento?

ti ringrazio molto.


Gaetano

lbenaglia Profilo | Guru

>L'importazione, però non l'ho potuta fare completa, in quanto
>la tabella MQ SQL ha un campo progressivo con identity su cui
>mi ha dato l'errore (non è presente nel file csv)

In questo caso devi ricorrere ad un file di formato che garantisca il corretto mapping tra le colonne del file CSV e della tabella di destinazione.
Per un esempio fai riferimento a questo post:
http://groups.google.it/group/microsoft.public.it.sql/msg/e83983c3354c1f36

>...e su un campo
>che nel dbf è numerico 2, mentre in sql è int.

Eh?! Fino ad ora parlavi di un file CSV, cos'è quel dbf?

>ti ringrazio molto.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

hai ragione, ma devo fare il porting di una piccola appliazione windows, con tabelle dbf di livello 7 in MS SQL, ma senza ricevere risposta.

Vedendo aruba, ho pensato di convertire in file in formato csv, così da poterlo importare.

Scusami, ho letto il link, ma non ci ho capito granche, soprattuto per la parte del mapping.

Nel link c'è in fondo:
Trovi tutti i dettagli sui Books Online.


ma cosa sono, come si cercano e cosa c'è di preciso?

ti ringrazio
Gaetano

lbenaglia Profilo | Guru

>hai ragione, ma devo fare il porting di una piccola appliazione
>windows, con tabelle dbf di livello 7 in MS SQL, ma senza ricevere
>risposta.
Da chi?

>Scusami, ho letto il link, ma non ci ho capito granche, soprattuto
>per la parte del mapping.
>
>Nel link c'è in fondo:
>Trovi tutti i dettagli sui Books Online.
>
>
>ma cosa sono, come si cercano e cosa c'è di preciso?
I Books Online sono la documentazione di SQL Server che puoi scaricare gratuitamente a partire dal seguente link:
http://technet.microsoft.com/en-us/sqlserver/bb428874.aspx

>ti ringrazio
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

ti ringrazio molto per l'aiuto.

Inizierò la lettura al più presto

ciao
Gaetano

gae58 Profilo | Senior Member

ciao Lorenzo,

scusa se ne approfitto, forse ho capito che cos'è un file di formato, però non riesco a scrivere la linea di codice che serve a creare il file di formato.

Leggendo il link che mi hai postatao ho copiato il codice di technet, per la creazione di un file non xml:
bcp AdventureWorks.HumanResources.Department format nul -T -n -f Department-n.fmt e l'ho trasformato in:

bcp Comuni format nul -T -n -f Comuni-n.fmt,
ma mi da' errore:
Messaggio 102, livello 15, stato 1, riga 1
Sintassi non corretta in prossimità di 'format'.

Penso che l'errore sia che no so dare il percorso della tabella.
Ho provato sia aggiungendo il database e sia l'owner, ma il risultatao non cambia.

Il nome del dataBase è CaCiRi e la Tabella Comuni.

I parametri del dataBase sono opzonali, comunque ho cprovato con:
bcp CaCiRi.Comuni format nul -T -n -f Comuni-n.fmt
bcp [C:\PROGETTIWEB\CACIRI\APP_DATA\CACIRI.MDF].[Comuni] format nul -T -n -f Comuni-n.fmt

bcp [C:\PROGETTIWEB\CACIRI\APP_DATA\CACIRI.MDF].[dbo].[Comuni] format nul -T -n -f Comuni-n.fmt

ma mi da' per tutti lo stesso errore:
Messaggio 102, livello 15, stato 1, riga 1
Sintassi non corretta in prossimità di '.'.

Preciso che seguo la riga all'interno di un file di query di Management Studio Express e non dalla riga di comando.

Ho provato anche da linea di comando e mi dice:
Impossibile aprire una connessione a Sql Server.

Ho provato anche a crea a mano il file di formato, ma alcune informazioni non mi sono chiare.

La tabella è:
CREATE TABLE [dbo].[Comuni](
[Progressivo] [bigint] IDENTITY(1,1) NOT NULL,
[Comune] [varchar](35) NOT NULL,
[Cap] [varchar](5) NOT NULL,
[Provincia] [varchar](2) NOT NULL,
[CodCatastale] [varchar](5) NOT NULL,
CONSTRAINT [PK_Comuni] PRIMARY KEY CLUSTERED
(
[Progressivo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]



il file di formato è:
BULK INSERT dbo.Comuni
FROM 'C:\ProgettiWeb\CaCiRi\App_Data\Comuni.csv'
WITH (
FORMATFILE = 'C:\ProgettiWeb\CaCiRi\App_Data\Comuni.fmt'
)
GO

Qualche consiglio?

grazie


Gaetano

lbenaglia Profilo | Guru

>bcp CaCiRi.Comuni format nul -T -n -f Comuni-n.fmt
>bcp [C:\PROGETTIWEB\CACIRI\APP_DATA\CACIRI.MDF].[Comuni] format
>nul -T -n -f Comuni-n.fmt
>
>bcp [C:\PROGETTIWEB\CACIRI\APP_DATA\CACIRI.MDF].[dbo].[Comuni]
>format nul -T -n -f Comuni-n.fmt
Argh!!!

>Qualche consiglio?
1 solo: passami un esempio di file csv con 10 righe e ti preparo un esempio funzionante altrimenti non ne usciamo.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

scusami Lorenzo, mi scuso per la mia ignoranza e ti ringrazio per l'enorme disponibilità che me hai dimostrato.

Ti allego il file csv, però mi servirebbe capire. Ti chiedo ciò in quanto devo passare alcune tabelle. Per una in particolare devo copiare i movimenti forzando lo stesso progressivo nella tabella MS Sql.

Se ho capito bene il programma bcp serve a creare il file di formato e collegare le colonne della tabella MS Sql con le colonne del file csv.

E' così?

grazie

Gaetano

lbenaglia Profilo | Guru

>Se ho capito bene il programma bcp serve a creare il file di
>formato e collegare le colonne della tabella MS Sql con le colonne
>del file csv.
>
>E' così?
No. BCP.exe è una piccola applicazione che serve per importare o esportare in modo estremamente efficiente i dati da/su file.
BLUK INSERT è un comando T-SQL che serve esclusivamente per importare i dati da un file, sfruttando le stesse identiche Bulk Copy API utilizzate anche da BCP.exe.

Ed ecco la soluzione al tuo problema.
Prima di tutto definisco il file C:\Comuni.fmt:

9.0 4 1 SQLCHAR 0 35 "," 2 Comune SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 5 "," 3 Cap SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 2 "," 4 Provincia SQL_Latin1_General_CP1_CI_AS 4 SQLCHAR 0 5 "\r\n" 5 codCatastale SQL_Latin1_General_CP1_CI_AS

Come vedi è banalissimo:
- indico la dimensione delle colonne
- il separatore di colonna e di riga
- il mapping tra le colonne del file Comuni.csv con quelle della tabella (notare che la colonna 1 del file è mappata alla 2 della tabella, ecc)
- la collation delle colonne.

Questo invece è il codice T-SQL:

USE tempdb; GO CREATE TABLE dbo.Comuni( Progressivo int IDENTITY(1,1) NOT NULL, Comune varchar(35) NOT NULL, Cap varchar(5) NOT NULL, Provincia varchar(2) NOT NULL, CodCatastale varchar(5) NOT NULL, CONSTRAINT PK_Comuni PRIMARY KEY CLUSTERED (Progressivo) ); BULK INSERT dbo.Comuni FROM 'C:\Comuni.csv' WITH ( FORMATFILE = 'C:\Comuni.fmt' , FIRSTROW = 2 ); SELECT * FROM dbo.Comuni; /* Output: Progressivo Comune Cap Provincia CodCatastale ----------- ----------------------------------- ----- --------- ------------ 1 AGLIE' 10011 TO A074 2 AIRASCA 10060 TO A109 3 ALA DI STURA 10070 TO A117 4 ALBIANO D'IVREA 10010 TO A157 5 ALICE SUPERIORE 10010 TO A199 6 ALMESE 10040 TO A218 7 ALPETTE 10080 TO A221 8 ALPIGNANO 10091 TO A222 9 ANDEZENO 10020 TO A275 10 ANDRATE 10010 TO A282 11 ANGROGNA 10060 TO A295 12 ARIGNANO 10020 TO A405 13 AVIGLIANA 10051 TO A518 14 AZEGLIO 10010 TO A525 (14 row(s) affected) */ DROP TABLE dbo.Comuni;

Come puoi notare nel comando BULK COPY ho specificato l'opzione FIRSTROW = 2 dato che la prima riga del file che mi hai passato contiene il nome delle colonne (che non dovrebbe esserci).
In questo modo inizio l'importazione dalla seconda riga.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

Ho eseguito tutto come da te scritto, ma mi ritorna questo errore:
Messaggio 4862, livello 16, stato 1, riga 1
Impossibile eseguire il caricamento di massa perché non è stato possibile leggere il file "C:\PROGETTIWEB\CACIRI\APP_DATA\Comuni.fmt". Codice di errore del sistema operativo (null).

Probabilmente sbaglio io qualcosa.

Ho creati un file di testo in cui inserisco le linee di codice per il file format che mi hai inviato e lo salvo col nome di Comuni.fmt
9.0
4
1 SQLCHAR 0 35 "," 2 Comune SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "," 3 Cap SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 2 "," 4 Provincia SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 5 "\r\n" 5 codCatastale SQL_Latin1_General_CP1_CI_AS


La parte del codice T-SQL la inserisco (attraverso Management Studio in una nuova query e la eseguo punto punto selezionando volta per volta le rgihe interessate (cos' mi hanno detto.

>USE tempdb;
>GO
ESEGUO

>CREATE TABLE dbo.Comuni(
>Progressivo int IDENTITY(1,1) NOT NULL,
>Comune varchar(35) NOT NULL,
>Cap varchar(5) NOT NULL,
>Provincia varchar(2) NOT NULL,
>CodCatastale varchar(5) NOT NULL,
>CONSTRAINT PK_Comuni PRIMARY KEY CLUSTERED (Progressivo)
>);
ESEGUO


>BULK INSERT dbo.Comuni
>FROM 'C:\Comuni.csv'
>WITH (
> FORMATFILE = 'C:\Comuni.fmt'
> , FIRSTROW = 2
>);
ESEGUO -- errore

>SELECT *
>FROM dbo.Comuni;
ESEGUO e mi riporta la tabella con le sole intestazioni.


>Come puoi notare nel comando BULK COPY ho specificato l'opzione
>FIRSTROW = 2
ho cambiato solo FIRSTROW = 1 perchè ho ricreato il csv senza intestazione

Forse non ho installato bene MS Sql?


Gaetano

lbenaglia Profilo | Guru

>Ho eseguito tutto come da te scritto, ma mi ritorna questo errore:
>Messaggio 4862, livello 16, stato 1, riga 1
>Impossibile eseguire il caricamento di massa perché non è stato
>possibile leggere il file "C:\PROGETTIWEB\CACIRI\APP_DATA\Comuni.fmt".
>Codice di errore del sistema operativo (null).
>
>Probabilmente sbaglio io qualcosa.
Eggià.
Prova a metterlo in C:\

>>Come puoi notare nel comando BULK COPY ho specificato l'opzione
>>FIRSTROW = 2
>ho cambiato solo FIRSTROW = 1 perchè ho ricreato il csv senza
>intestazione
Toglilo del tutto.

>Forse non ho installato bene MS Sql?
Boh.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

la porzione di codice è questa:
BULK INSERT dbo.Comuni
FROM 'C:\Comuni.csv'
WITH (
FORMATFILE = 'C:\Comuni.fmt'
);


l'errore è sempre lo stesso:
Messaggio 4862, livello 16, stato 1, riga 1
Impossibile eseguire il caricamento di massa perché non è stato possibile leggere il file "C:\Comuni.fmt". Codice di errore del sistema operativo (null).
Sicuramente è qualcosa che ho sul mio PC che gli da' fastidio, ma non so cosa.

Tieni presente che l'altro giorno ha funzionato, però senza progressivo.

Gaetano

errore:
Il provider OLE DB "BULK" per il server collegato "(null)" ha segnalato un errore. Il provider non ha fornito informazioni sull'errore.

Il null potrebbe essere rappresentato da questo errore?

gae58 Profilo | Senior Member

scusa non potrebbe essere che scrivo male il file fmt?

potresti mandarmi direttamente il file che hai creato tu stamattina e non il codice?

E' giusto un tentativo

grazie
Gaetano

lbenaglia Profilo | Guru

>scusa non potrebbe essere che scrivo male il file fmt?
Devi fare un banalissimo copia & incolla in Notepad di quanto ho postato sopra
Verifica di aver messo un "ritorno a capo" (CrLf) dopo l'ultima riga.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

>Verifica di aver messo un "ritorno a capo" (CrLf) dopo l'ultima
>riga.

scoperto l'arcano. Ti preciso che nelle prove verificavo che non ci fosse l'invio sull'ultima riga.

Adesso funziona tutto. Ti ringrazio tantissimo e spero in un modo o nell'altro di poterti ricambiare la disponibilità.

di nuovo una grande grazie

Gaetano

gae58 Profilo | Senior Member

ciao Lorenzo,
ho provato ad effettuare un altro passaggio (con un'altra tabella) ed ho notato che nella Tabella di MS sql ci devono essere tutti i campi che compongono il csv, altrimenti nel campo vengono passati sia il campo presente nella tabella di MS Sql e sia quello non presente.

Non so se ti posso chiedere un altro aiuto, sempre riguardante l'importazione dei dati.

Il passaggio l'ho effettuato sul PC che lavora in locale. Adesso dovrei passare i movimenti sullo spazio web che ho su aruba.
Pensavo dalla tabella locale di creare un file csv e poi farlo importare su ARUBA.
Ho visto su Management Studio, ma non ho trovato l'esportazione dei dati in csv.

Qualche consiglio?

grazie

Gaetano

lbenaglia Profilo | Guru

>ho provato ad effettuare un altro passaggio (con un'altra tabella)
>ed ho notato che nella Tabella di MS sql ci devono essere tutti
>i campi che compongono il csv, altrimenti nel campo vengono passati
>sia il campo presente nella tabella di MS Sql e sia quello non
>presente.
A prescindere che non ho capito niente di quello che hai scritto () non è necessario che la tabella di destinazione debba avere necessariamente tutte le colonne del file CSV:

"Using a Format File to Skip a Data Field"
http://msdn2.microsoft.com/en-us/library/ms187908.aspx

>Il passaggio l'ho effettuato sul PC che lavora in locale. Adesso
>dovrei passare i movimenti sullo spazio web che ho su aruba.
Dubito che ti facciano utilizzare bcp.exe o la BULK INSERT.
Ti conviene contattarli e farti dire come passare i dati.

>Ho visto su Management Studio, ma non ho trovato l'esportazione
>dei dati in csv.
>
>Qualche consiglio?
Usa bcp.exe

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

>"Using a Format File to Skip a Data Field"
>http://msdn2.microsoft.com/en-us/library/ms187908.aspx
>Usa bcp.exe

ciao Lorenzo,

ho seguito il tuo consiglio ed ho letto il link che mi hai indicato. E' stato molto interessante e chiarificatore.

Però...

Ho provato a creare il file di format attraverso il bcp e non manualmente.
Come da esempio ho creato la tabella in un mio dataBase:
CREATE TABLE dbo.prova(
Col1 int IDENTITY(1,1) NOT NULL,
Col2 nvarchar(50),
Col3 nvarchar(50),
Col4 nvarchar(50)
);
GO

e poi dal prompt dei comandi di wondows (vecchio dos), ho scritto il comando indicato:
bcp CaCiri..Prova format nul -c -t, -f Formato.fmt -T
però mi da' questo errore:
SQLState = 08001, NativeError = 2
Error = [Microsoft][SQl Native Client]Provider named pipe: Impossibile aprire una connessione a SQl server [2].

Ho provato a cambiare:
bcp CaCiri.Prova format nul -c -t, -f Formato.fmt -T
bcp Prova format nul -c -t, -f Formato.fmt -T
bcp dbo.Prova format nul -c -t, -f Formato.fmt -T

ma non ci sono riuscito.

Sicuramente sbaglio io qualcosa, ma non so come si fa la connessione al dataBase dal prompt dei comandi

ciao




Gaetano

lbenaglia Profilo | Guru

>Sicuramente sbaglio io qualcosa, ma non so come si fa la connessione
>al dataBase dal prompt dei comandi
La sintassi di bcp e dei file di formato è spiegata BENISSIMO sui Books Online.
I link li hai, alcuni esempi pure, ora direi che hai tutte le carte in regola per riuscire in modo autonomo nella tua impresa
Armati di un po' di pazienza, spendi un'oretta per capire nel dettaglio come funzionano queste tecnologie ed inizia a sperimentare per conto tuo.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gae58 Profilo | Senior Member

ti ringrazio, vedrò se riesco a capire come effettuare il collegamento

ciao

Gaetano
Gaetano

gae58 Profilo | Senior Member

ciao Lorenzo, scusa se riprendo il thread, ma avendo fatto un po' di esperienza, vorrei capire dove sbaglio in un'importazione.

Creo la Tabella, creo il file di formato:
!!bcp caciri.dbo.Art80 format null -n -t; -f C:\ProgettiWeb\CaCiRi\App_Data\Art80.fmt -S SoftwareGL\SqlExpress -T

creo il file csv da un file di excel (ho inserito il delimitataore punto e virgola perchè è quello che mette excel)

ed uso il comando che mi hai indicato:
BULK INSERT dbo.Art80
FROM 'C:\ProgettiWeb\CaCiRi\APP_DATA\Art80.csv'
WITH (
FORMATFILE = 'C:\ProgettiWeb\CaCiRi\APP_DATA\Art80.fmt'
);
per poter effettuare l'importazione, ma mi ritorna un errore:
Il file di dati contiene una colonna troppo lunga per la riga 1, colonna 2. Verificare che i caratteri di terminazione di campo e di riga siano specificati correttamente.

Se invece uso questa istruzione va tutto a buon fine:
!!bcp caciri.dbo.Art80 in C:\ProgettiWeb\CaCiRi\App_Data\Art80.csv -k -c -R -t; -S SoftwareGL\SqlExpress -T.

Per quel che ho potuto capire Bulk Insert inserisce i dati attraverso un file di formato, mentre bcp li inserisce sequenzialmente.

Mi dirai visto che ti funziona cosa c'è che non va?

Nel file da riempire, ho un campo identity e vorrei che non partisse da 1 e si incrementasse man mano, ma che venga valorizzato con il numero che è presente nel file csv.

Con bcp mi inzia sempre da uno e non ho capito qual'è l'istruzione che mi permette di conservare il numero che importo.

Con BULK INSERT, avendo l'errore che ti ho indicato, non so come fare altre prove.

Qualche consiglio?

grazie

Ho letto meglio le opzioni ed ho visto che in bcp attraverso l'opzione -E forza nella colonna che ha l'identity il valore del file csv.
Se non ti dispiace, vorrei capire dove sbaglio con l'istruzione BULK INSERT
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5