Pergunta

Eu preciso importar um arquivo CSV grande em um servidor SQL. Estou usando este:

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

problema é todos os meus campos estão entre aspas (" ") para uma linha realmente se parece com:

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

Can I alguma forma de importação em massa-los e dizer-SQL para usar as aspas como delimitadores de campo?

Editar : O problema com o uso de ' ''' como delimitador, como nos exemplos sugeridas é que: O que a maioria dos exemplos fazer, é que importar os dados, incluindo o primeiro "na primeira coluna ea última" na última, então vá em frente e tira isso. Infelizmente o meu primeiro (e último) coluna são datetime e não permitirá que um "20080902 a ser importado como data e hora.

Pelo que andei lendo arround Acho FORMATFILE é o caminho a percorrer, mas a documentação (incluindo MSDN) é terrivelmente unhelpfull.

Foi útil?

Solução

Eu sei que isto não é uma solução real, mas eu uso uma tabela fictícia para a importação com o conjunto nvarchar para tudo. Então eu faço uma inserção que retira as "personagens e faz as conversões. Não é bonito, mas ele faz o trabalho.

Outras dicas

Tente FIELDTERMINATOR='","'

Aqui é um ótimo link para ajuda com a primeira e última citação ... olhar como ele usou a subsequência a SP

http: //www.sqlteam. com / artigo / utilizando-bulk-insert-to-load-a-texto arquivo

Outro truque que eu uso às vezes, é abrir o CSV no Excel, em seguida, escrever a instrução SQL para uma célula no final de cada linha. Por exemplo:

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

Um preenchimento-down pode preencher isso em cada linha para você. Em seguida, basta copiar e colar a saída em uma nova janela de consulta.

É old-school, mas se você só precisa fazer as importações de vez em quando você economiza brincando com a leitura de toda a documentação obscura no caminho 'adequado' para fazê-lo.

Tente OpenRowSet . Isso pode ser usado para importar o material Excel. Excel pode abrir arquivos CSV, assim você só precisa descobrir o correto [ConnectionString] [2].

[2]: Driver = {Microsoft Text Driver (* .txt; * .csv)}; DBQ = c: \ txtFilesFolder \; Extensions = asc, csv, aba, txt;

ID de uso digamos FileHelpers seus uma biblioteca open source

Você precisa fazer isso programaticamente, ou é um tiro de uma só vez?

Usando o Enterprise Manager, clique com o botão direito importação de dados permite que você selecione o seu delimitador.

Você tem que tomar cuidado com INSERT BCP / BULK porque nem BSP ou inserção em massa lidar com isso bem se o citando não é consistente, mesmo com arquivos de formato (arquivos em formato XML ainda não oferecem a opção) e manequim [ "] caracteres no início e fim e usando [", '] como o separador. arquivos Tecnicamente CSV não precisa ter ['] caracteres caso não existam incorporado [,] caracteres

É por esta razão que os arquivos delimitados por vírgula são muitas vezes referidos como arquivos limitado de comédia.

OpenRowSet exigirá Excel no servidor e pode ser problemático em ambientes de 64 bits - Eu sei que é problemático usando o Excel em Jet em 64 bits

.

SSIS é realmente a sua melhor aposta se o arquivo é susceptível de variar a partir de suas expectativas no futuro.

u pode tentar este código que é muito doce, se quiser, isto irá remover vírgula indesejados do seu código. Se, por exemplo, seus dados estão assim:
"Kelly", "Reynold", "kelly@reynold.com"

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**

Firs você precisa arquivo de importação CSV para Tabela de Dados

Em seguida, você pode inserir registros em massa usando 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);
                }
            }
        }
    }
}

Sim, K Richard tem razão: FIELDTERMINATOR = '","'

Consulte http: // www. sqlteam.com/article/using-bulk-insert-to-load-a-text-file para mais informações.

Você também pode usar DTS ou SSIS.

Você tem controle sobre o formato de entrada? | (tubos) e \ t costumam fazer para obter melhores terminadores de campo.

Se você descobrir como obter o arquivo analisado em um DataTable, eu sugiro a classe SqlBulkInsert para inseri-lo no SQL Server.

Esta é uma questão de idade, então eu escrevo isto para ajudar quem tropeçar em cima dele.

SQL Server 2017 introduz o parâmetro FIELDQUOTE que se destina para este caso de uso exato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top