SQL Import în vrac din CSV

Trebuie să importați un fișier CSV mare într-un server SQL. Folosesc acest lucru:

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

problema este că toate câmpurile mele sunt înconjurate de citate (""), astfel încât un rând arată de fapt:

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

Pot importa oarecum în vrac și le spun SQL să utilizeze citatele ca delimitatoare de câmp?

Edit: The problem with using '","' as delimiter, as in the examples suggested is that : What most examples do, is they import the data including the first " in the first column and the last " in the last, then they go ahead and strip that out. Alas my first (and last) column are datetime and will not allow a "20080902 to be imported as datetime.

Din ceea ce am citit în jur, cred că FORMATFILE este calea de urmat, dar documentația (inclusiv MSDN) este extrem de nefolositoare.

0
Ar trebui să re-etichetați acest server sqlserver astfel încât să știm ce bază de date utilizați.
adăugat autor JasonS, sursa

12 răspunsuri

Trebuie să urmăriți cu BCP/BULK INSERT deoarece nici BSP, nici Bulk Insert nu se ocupă de acest lucru dacă citarea nu este consecventă, chiar și cu fișierele de format (chiar și fișierele de format xml nu oferă opțiunea) și cu caracterele [ începând și terminând și utilizând [","] ca separator. Fișierele CSV tehnice nu trebuie să aibă ["] caractere dacă nu există caractere [] încorporate

Din acest motiv, fișierele delimitate în virgulă sunt uneori denumite fișiere cu conținut limitat de comedie.

OpenRowSet va necesita Excel pe server și ar putea fi problematică în medii pe 64 de biți - știu că este problematică folosind Excel în Jet pe 64 de biți.

SSIS este cu adevărat cel mai bun pariu dacă fișierul este probabil să difere de așteptările dvs. în viitor.

0
adăugat

Yup, K Richard is right: FIELDTERMINATOR = '","'

Consultați http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file pentru mai multe informații.

0
adăugat

Încercați să OpenRowSet . Acest lucru poate fi folosit pentru a importa chestii Excel. Excel poate deschide fișiere CSV, deci trebuie doar să dați seama de [ConnectionString] [2] corect.

[2]: Driver = {Microsoft Text Driver (* .txt; * .csv)}; Dbq = c: \ txtFilesFolder \; Extensii = asc, csv, tab, txt;

0
adăugat

Un alt hack pe care îl folosesc uneori este să deschid CSV-ul în Excel, apoi să scriu instrucțiunea sql într-o celulă de la sfârșitul fiecărui rând. De exemplu:

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

O completare poate umple acest lucru în fiecare rând pentru tine. Apoi, copiați și inserați ieșirea într-o nouă fereastră de interogare.

Este vechea școală, dar dacă trebuie doar să faci importuri din când în când, te salvează în jur, citiți toată documentația obscură pe calea potrivită.

0
adăugat
Sfat frumos, @ jorgeburgos
adăugat autor karlgrz, sursa
Știu că acest răspuns este vechi, dar tocmai am ajuns aici cu o căutare Google pentru ceva similar. Acesta este momentul excelent când doriți să generați orice cod din datele tabulare, nu doar codul pentru a încărca o instrucțiune SQL. Puteți plasa un șablon undeva în fișierul Excel, apoi faceți = SUBSTITUTE ($ Z $ 999, "placeholder_a", "&" SUBSTITUTE (A2, "'", "placeholder_b", SUBSTITUTE (B2, "" "," "")) . Presupunând că aveți un șablon în $ Z $ 999.
adăugat autor Don 01001100, sursa
Sfat bun, multumesc!
adăugat autor DanB, sursa

Trebuie să faceți acest lucru programabil, sau este o dată împușcată?

Utilizând Managerul Enterprise, faceți clic dreapta pe Import Data vă permite să selectați delimitatorul.

0
adăugat

Dacă vă dați seama cum să obțineți parsarea unui fișier într-un tabel de date, aș sugera clasa SqlBulkInsert pentru inserarea acestuia în SQL Server.

0
adăugat

Puteți utiliza, de asemenea, DTS sau SSIS.

0
adăugat

Try FIELDTERMINATOR='","'

Aici este o legătură excelentă pentru a ajuta la primul și ultimul citat ... uite cum a folosit substringul SP

http://www.sqlteam.com/article/folosind-vrac-inserați-la-încărcare-un text-fișier

0
adăugat
A lucrat și pentru mine. Folosesc un fișier format xml astfel încât atributul Terminator a fost folosit în loc de FIELDTERMINATOR. De asemenea, în ultima mea coloană am folosit următoarea TERMINATOR = '' \ r \ n '
adăugat autor Craig McKeachie, sursa
Acesta nu va funcționa :-(. Primul câmp din tabel este un datetime și va importa citatul principal (") cu el, generând o eroare
adăugat autor Radu094, sursa
De asemenea, feriți-vă de aplicațiile care exportă CSV cu șiruri de caractere cotate, dar numerele nu sunt cotate.
adăugat autor finnw, sursa

Aveți control asupra formatului de intrare? | (țevi) și, de obicei, pentru terminatoare de teren mai bune.

0
adăugat

Știu că nu este o soluție reală, dar folosesc o masă falsă pentru import cu setul nvarchar pentru tot. Apoi, fac o inserție care scutură "personajele" și face conversiile. Nu este drăguță, ci face treaba.

0
adăugat
Cum împarți câmpurile când pot exista virgule între ghilimele?
adăugat autor Jeremy Stein, sursa

Id spune că folosesc FileHelpers pentru o bibliotecă open source

0
adăugat

Buclele trebuie să importați fișierul CSV în tabelul de date

Apoi puteți introduce rânduri vrac utilizând 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);
                }
            }
        }
    }
}
0
adăugat