Partilhar via


Consultar ficheiros CSV

Neste artigo, você aprenderá a consultar um único arquivo CSV usando o pool SQL sem servidor no Azure Synapse Analytics. Os ficheiros CSV podem ter diferentes formatos:

  • Com e sem linha de cabeçalho
  • Valores delimitados por vírgulas e tabulações
  • Terminações de linha no estilo Windows e Unix
  • Valores não cotados e cotados e caracteres que escapam

Todas as variações acima serão abordadas abaixo.

Exemplo de início rápido

OPENROWSET permite que você leia o conteúdo do arquivo CSV, fornecendo o URL para o seu arquivo.

Ler um arquivo csv

A maneira mais fácil de ver o conteúdo do seu CSV arquivo é fornecer URL de arquivo para OPENROWSET funcionar, especificar csv FORMATe 2.0 PARSER_VERSION. Se o arquivo estiver disponível publicamente ou se sua identidade do Microsoft Entra puder acessar esse arquivo, você poderá ver o conteúdo do arquivo usando a consulta como a mostrada no exemplo a seguir:

select top 10 *
from openrowset(
    bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    format = 'csv',
    parser_version = '2.0',
    firstrow = 2 ) as rows

A opção firstrow é usada para ignorar a primeira linha no arquivo CSV que representa o cabeçalho neste caso. Certifique-se de que consegue aceder a este ficheiro. Se o seu arquivo estiver protegido com chave SAS ou identidade personalizada, você precisará configurar a credencial no nível do servidor para login sql.

Importante

Se o arquivo CSV contiver caracteres UTF-8, verifique se você está usando um agrupamento de banco de dados UTF-8 (por exemplo Latin1_General_100_CI_AS_SC_UTF8). Uma incompatibilidade entre a codificação de texto no arquivo e o agrupamento pode causar erros de conversão inesperados. Você pode alterar facilmente o agrupamento padrão do banco de dados atual usando a seguinte instrução T-SQL: alter database current collate Latin1_General_100_CI_AI_SC_UTF8

Uso da fonte de dados

O exemplo anterior usa o caminho completo para o arquivo. Como alternativa, você pode criar uma fonte de dados externa com o local que aponta para a pasta raiz do armazenamento:

create external data source covid
with ( location = 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases' );

Depois de criar uma fonte de dados, você pode usar essa fonte de dados e o caminho relativo para o arquivo na OPENROWSET função:

select top 10 *
from openrowset(
        bulk 'latest/ecdc_cases.csv',
        data_source = 'covid',
        format = 'csv',
        parser_version ='2.0',
        firstrow = 2
    ) as rows

Se uma fonte de dados estiver protegida com chave SAS ou identidade personalizada, você poderá configurar a fonte de dados com credencial de escopo de banco de dados.

Especificar explicitamente o esquema

OPENROWSET Permite especificar explicitamente quais colunas você deseja ler do arquivo usando WITH a cláusula:

select top 10 *
from openrowset(
        bulk 'latest/ecdc_cases.csv',
        data_source = 'covid',
        format = 'csv',
        parser_version ='2.0',
        firstrow = 2
    ) with (
        date_rep date 1,
        cases int 5,
        geo_id varchar(6) 8
    ) as rows

Os números após um tipo de dados na cláusula representam o WITH índice da coluna no arquivo CSV.

Importante

Se o arquivo CSV contiver caracteres UTF-8, certifique-se de especificar explicitamente algum agrupamento UTF-8 (por exemplo Latin1_General_100_CI_AS_SC_UTF8) para todas as colunas na WITH cláusula ou defina algum agrupamento UTF-8 no nível do banco de dados. A incompatibilidade entre a codificação de texto no arquivo e o agrupamento pode causar erros de conversão inesperados. Você pode alterar facilmente o agrupamento padrão do banco de dados atual usando a seguinte instrução T-SQL: alter database current collate Latin1_General_100_CI_AI_SC_UTF8 Você pode facilmente definir o agrupamento nos tipos de coluna usando a seguinte definição: geo_id varchar(6) collate Latin1_General_100_CI_AI_SC_UTF8 8

Nas seções a seguir, você pode ver como consultar vários tipos de arquivos CSV.

Pré-requisitos

Seu primeiro passo é criar um banco de dados onde as tabelas serão criadas. Em seguida, inicialize os objetos executando o script de instalação nesse banco de dados. Esse script de instalação criará as fontes de dados, credenciais com escopo de banco de dados e formatos de arquivo externos usados nesses exemplos.

Nova linha estilo Windows

A consulta a seguir mostra como ler um arquivo CSV sem uma linha de cabeçalho, com uma nova linha no estilo do Windows e colunas delimitadas por vírgula.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV sem cabeçalho, nova linha estilo Windows.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '\n'
    )
WITH (
    [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
    [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
    [year] smallint,
    [population] bigint
) AS [r]
WHERE
    country_name = 'Luxembourg'
    AND year = 2017;

Nova linha estilo Unix

A consulta a seguir mostra como ler um arquivo sem uma linha de cabeçalho, com uma nova linha no estilo Unix e colunas delimitadas por vírgula. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV sem linha de cabeçalho e com nova linha Unix-Style.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population-unix/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '0x0a'
    )
WITH (
    [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
    [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
    [year] smallint,
    [population] bigint
) AS [r]
WHERE
    country_name = 'Luxembourg'
    AND year = 2017;

Linha de cabeçalho

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix e colunas delimitadas por vírgula. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV com linha de cabeçalho e com nova linha Unix-Style.

SELECT *
FROM OPENROWSET(
    BULK 'csv/population-unix-hdr/population.csv',
    DATA_SOURCE = 'SqlOnDemandDemo',
    FORMAT = 'CSV', PARSER_VERSION = '2.0',
    FIELDTERMINATOR =',',
    HEADER_ROW = TRUE
    ) AS [r]

A opção HEADER_ROW = TRUE resultará na leitura de nomes de colunas da linha de cabeçalho no arquivo. É ótimo para fins de exploração quando você não está familiarizado com o conteúdo do arquivo. Para obter o melhor desempenho, consulte a seção Usar tipos de dados apropriados em Práticas recomendadas. Além disso, você pode ler mais sobre a sintaxe OPENROWSET aqui.

Caractere de cotação personalizada

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix, colunas delimitadas por vírgulas e valores entre aspas. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV com linha de cabeçalho e com nova linha Unix-Style e valores entre aspas.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population-unix-hdr-quoted/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '0x0a',
        FIRSTROW = 2,
        FIELDQUOTE = '"'
    )
    WITH (
        [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
        [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
        [year] smallint,
        [population] bigint
    ) AS [r]
WHERE
    country_name = 'Luxembourg'
    AND year = 2017;

Nota

Essa consulta retornaria os mesmos resultados se você omitisse o parâmetro FIELDQUOTE, já que o valor padrão para FIELDQUOTE é uma aspa dupla.

Carateres de escape

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix, colunas delimitadas por vírgulas e um caracteres de escape usado para o delimitador de campo (vírgula) dentro de valores. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV com linha de cabeçalho e com nova linha Unix-Style e escape char usado para delimitador de campo.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population-unix-hdr-escape/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '0x0a',
        FIRSTROW = 2,
        ESCAPECHAR = '\\'
    )
    WITH (
        [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
        [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
        [year] smallint,
        [population] bigint
    ) AS [r]
WHERE
    country_name = 'Slovenia';

Nota

Esta consulta falharia se ESCAPECHAR não fosse especificado, uma vez que a vírgula em "Slov,enia" seria tratada como delimitador de campo em vez de parte do nome do país/região. "Slov,enia" seria tratado como duas colunas. Portanto, a linha específica teria uma coluna a mais do que as outras linhas e uma coluna a mais do que você definiu na cláusula WITH.

Escape citando caracteres

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix, colunas delimitadas por vírgulas e um char de aspas duplas escapado dentro de valores. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix, colunas delimitadas por vírgulas e um char de aspas duplas escapado dentro de valores.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population-unix-hdr-escape-quoted/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '0x0a',
        FIRSTROW = 2
    )
    WITH (
        [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
        [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
        [year] smallint,
        [population] bigint
    ) AS [r]
WHERE
    country_name = 'Slovenia';

Nota

O caractere de citação deve ser escapado com outro caractere de citação. O caractere de citação pode aparecer dentro do valor da coluna somente se o valor for encapsulado com caracteres de aspas.

Arquivos delimitados por tabulação

A consulta a seguir mostra como ler um arquivo com uma linha de cabeçalho, com uma nova linha no estilo Unix e colunas delimitadas por tabulações. Observe o local diferente do arquivo em comparação com os outros exemplos.

Pré-visualização do ficheiro:

Primeiras 10 linhas do arquivo CSV com linha de cabeçalho e com novo delimitador de linha e tabulação Unix-Style.

SELECT *
FROM OPENROWSET(
        BULK 'csv/population-unix-hdr-tsv/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR ='\t',
        ROWTERMINATOR = '0x0a',
        FIRSTROW = 2
    )
    WITH (
        [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
        [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2,
        [year] smallint,
        [population] bigint
    ) AS [r]
WHERE
    country_name = 'Luxembourg'
    AND year = 2017

Retornar um subconjunto de colunas

Até agora, você especificou o esquema de arquivo CSV usando WITH e listando todas as colunas. Você só pode especificar colunas que realmente precisa em sua consulta usando um número ordinal para cada coluna necessária. Você também omitirá colunas sem interesse.

A consulta a seguir retorna o número de nomes de país/região distintos em um arquivo, especificando apenas as colunas necessárias:

Nota

Dê uma olhada na cláusula WITH na consulta abaixo e observe que há "2" (sem aspas) no final da linha onde você define a coluna [country_name]. Isso significa que a coluna [country_name] é a segunda coluna do arquivo. A consulta ignorará todas as colunas no arquivo, exceto a segunda.

SELECT
    COUNT(DISTINCT country_name) AS countries
FROM OPENROWSET(
        BULK 'csv/population/population.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV', PARSER_VERSION = '2.0',
        FIELDTERMINATOR =',',
        ROWTERMINATOR = '\n'
    )
WITH (
    --[country_code] VARCHAR (5),
    [country_name] VARCHAR (100) 2
    --[year] smallint,
    --[population] bigint
) AS [r]

Consultando arquivos anexáveis

Os arquivos CSV usados na consulta não devem ser alterados enquanto a consulta estiver em execução. Na consulta de longa execução, o pool SQL pode repetir leituras, ler partes dos arquivos ou até mesmo ler o arquivo várias vezes. Alterações no conteúdo do arquivo causariam resultados errados. Portanto, o pool SQL falhará na consulta se detetar que o tempo de modificação de qualquer arquivo é alterado durante a execução da consulta.

Em alguns cenários, talvez você queira ler os arquivos que são constantemente acrescentados. Para evitar as falhas de consulta devido a arquivos anexados constantemente, você pode permitir que a OPENROWSET função ignore leituras potencialmente inconsistentes usando a ROWSET_OPTIONS configuração.

select top 10 *
from openrowset(
    bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    format = 'csv',
    parser_version = '2.0',
    firstrow = 2,
    ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}') as rows

A ALLOW_INCONSISTENT_READS opção de leitura desativará a verificação do tempo de modificação do arquivo durante o ciclo de vida da consulta e lerá o que estiver disponível no arquivo. Nos arquivos anexáveis, o conteúdo existente não é atualizado e apenas novas linhas são adicionadas. Portanto, a probabilidade de resultados errados é minimizada em comparação com os arquivos atualizáveis. Essa opção pode permitir que você leia os arquivos anexados com freqüência sem manipular os erros. Na maioria dos cenários, o pool SQL simplesmente ignorará algumas linhas que são anexadas aos arquivos durante a execução da consulta.

Próximos passos

Os próximos artigos irão mostrar-lhe como: