Parâmetros de string de conexão para fontes de arquivos de texto
No artigo anterior, abordei os parâmetros de cadeia de conexão para fontes de dados do Excel. Agora vamos nos concentrar nos arquivos de texto. Existem diferentes métodos para descrever o esquema de arquivos de texto e usar as informações durante a abertura ou vinculação no Access. Embora as planilhas do Excel tenham alguma semelhança de estrutura, isso não é verdade para os arquivos de texto. Temos que responder a várias perguntas sobre a estrutura de um arquivo de texto, incluindo:
- É delimitado ou largura fixa?
- Como sabemos quando uma coluna termina e outra começa?
- O texto é citado ou não?
- Como devemos analisar datas e horas?
- E os valores em moeda? Como eles devem ser formatados?
e possivelmente mais. Embora o CSV possa parecer bem definido à primeira vista, mas quando você o explora, na verdade é muito vagamente definido. Não há um acordo universal sobre se o texto deve ser citado, como as datas devem ser formatadas. Por todas essas razões, o uso de arquivos de texto geralmente requer o uso de algum tipo de informação de esquema para descrever a estrutura do arquivo de texto. Há três maneiras de armazenar informações de esquema:
- Um
schema.ini
arquivo armazenado em um diretório - Acessar o
MSysIMEX
eMSysIMEXColumns
tabelas - Acesse o
ImportExportSpecification.XML
propriedade.
Para complicar as coisas, existem vários métodos diferentes que podemos usar para trabalhar com arquivos de texto, mas nem todos os métodos podem usar todas as 3 maneiras diferentes de obter as informações do esquema. Por exemplo,
DoCmd.TransferText
funciona com as tabelas do sistema, mas não com importações/exportações salvas. Por outro lado, DoCmd.RunSavedImportExport
funciona com a ImportExportSpecification
objeto. No entanto, a ImportExportSpecification
não é usado como parte da vinculação. Portanto, para nossa discussão, na verdade temos apenas 2 métodos disponíveis no contexto de abrir ou vincular a um arquivo de texto. É importante observar a distinção entre salvar uma especificação no MSysIMEXSpecs
&MSysIMEXColumns
tabelas vs. salvar uma importação/exportação que se torna uma ImportExportSpecification
objeto. Vamos explorar esses 2 métodos nos próximos artigos. String de conexão para arquivo de texto
Devemos considerar como o Access perceberá um arquivo de texto. No artigo anterior, vimos que cada planilha ou intervalo nomeado era representado como uma “tabela” em um “banco de dados” de planilha Excel. Mas um arquivo de texto não tem essa construção. O que faz um “banco de dados” então? A resposta é que a pasta representa um “banco de dados” e, portanto, quaisquer arquivos de texto dentro de uma pasta são “tabelas”. Por esse motivo, é possível ter várias informações de esquema para a mesma pasta se essa pasta contiver mais de um formato possível para qualquer arquivo de texto armazenado na pasta. Você verá mais tarde que, quando construímos a string de conexão, vinculamos à pasta e acessamos o arquivo individual como uma tabela.
Portanto, usando esta configuração como mostrado:
Podemos então abrir um arquivo de texto usando este código VBA:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DATABASE=C:\Links") Dim tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Debug.Print Next
Isso deve gerar a saída:
Products#csv Products Count PackDate Amount ShipDate Apples 3 12/4/2020 $ 1.02 4/12/2020 Bananas 5 4/12/2020 $ 1,234.56 12/4/2020 Figs 8 5/7/2020 $ 0.01 7/5/2020 Grapes 11 10/10/2020 $12.30 10/10/2020
Tome nota das seguintes coisas:
- Não especificamos o arquivo de texto em nossa string de conexão. Em vez disso, usamos a pasta.
- Os nomes das “tabelas” foram alterados porque um ponto no nome não é um caractere válido. Portanto,
products.csv
tornou-seproducts#csv
. - Comparado ao Excel, não há parâmetros obrigatórios além de especificar o driver do arquivo de texto e o caminho para a pasta.
No próximo artigo, você aprenderá mais sobre a descrição do esquema de arquivos de texto. No entanto, para a própria cadeia de conexão, as palavras-chave a seguir são reconhecidas.
FMT
parâmetro:Indique o formato do arquivo de texto.
Delimited
:O arquivo é delimitado por um caractere. O caractere usado é especificado pelas informações do esquema.Fixed
:O arquivo tem largura fixa para coluna(s). Novamente, as larguras de coluna específicas são especificadas pelas informações do esquema. HDR
parâmetro:linha de cabeçalho
YES
:A primeira linha é o cabeçalho e deve se tornar os nomes das colunas para a “tabela”/”conjunto de registros”NO
:A primeira linha não é tratada de forma diferente e é apenas um dado. Todos os nomes de coluna serão nomeados “FN” onde “N” é um número começando com 1 IMEX
parâmetro:comportamento de importação/exportação
Isso rege como os tipos de dados da coluna devem ser definidos, com base no conteúdo:
1
:se a coluna contiver tipos de dados diferentes, trate-a como uma string. Caso contrário, corresponda a coluna ao melhor tipo de dados.2
:sempre corresponda a coluna a um determinado tipo de dados com base na amostra. Isso pode causar um erro na leitura quando lemos uma linha que contém dados que não correspondem ao tipo de dados esperado. ACCDB
parâmetro:indica que o Access está usando o formato de arquivo ACCDB?
Por padrão, sempre é definido ACCDB=YES em um formato de arquivo accdb. No entanto, omitir ou defini-lo como NÃO parece não fazer nada. É um pouco de mistério. Se alguém puder compartilhar qual efeito esse parâmetro, poste em comentário e atualizarei o blog.
DATABASE
parâmetro:Caminho para a pasta que contém os arquivos de texto
O parâmetro deve conter um caminho totalmente qualificado. Não deve incluir os nomes dos arquivos de texto.
CharacterSet
Parâmetro:Identifica a codificação de caracteres a ser usada para ler os arquivos de texto.
Isso será discutido com mais detalhes no próximo artigo. Isso também pode ser descrito nas informações do esquema.
DSN
Parâmetro:identifica as informações do esquema a serem usadas com o arquivo de texto.
O nome deve corresponder ao
MSysIMEXSpec
, que será analisado em artigo posterior. Isso só funciona com o MSysIMEX***
mesas. Se você deseja usar schema.ini
, você simplesmente não inclui nenhum DSN
em suas cadeias de conexão. É importante observar que o driver de arquivo de texto considerará apenas os parâmetros listados acima. Não é possível inserir outras palavras-chave e fazer com que sejam analisadas pelo driver do arquivo de texto. Por esse motivo, você não poderá especificar todos os detalhes sobre um arquivo de texto apenas a partir da cadeia de conexão.
Esquema padrão para arquivos de texto
Em teoria, você pode abrir ou vincular um arquivo de texto sem nenhuma informação de esquema, mas isso raramente funcionará. Nessa situação, o Access simplesmente assumirá os padrões para várias opções. Se o arquivo de texto estiver em conformidade com todos os padrões atuais, o Access terá êxito na leitura do arquivo. Mais importante, a ausência de erros ao abrir ou vincular ao arquivo de texto não significa que os dados sejam representados de forma significativa. Por exemplo, valores de moeda especialmente formatados podem ser interpretados como texto em vez de moeda, e texto não delimitado com vírgulas dentro do texto pode ser analisado incorretamente, adicionando colunas indesejadas. Os padrões são determinados em dois lugares possíveis:
- O Access examinará as configurações do registro. Para instalação do Office 365, o registro pode estar localizado em:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. Vamos nos referir a esse local como "Chaves de registro de texto" nos próximos artigos. - As configurações que você veria na
Region
applet no painel de controle do Windows. Vamos nos referir a este local como “configurações do Windows”.
Observação sobre a codificação dos arquivos de texto
É obrigatório ter a codificação correta, independentemente de quais métodos você pode usar para acessar seus arquivos de texto. Quando o conteúdo do seu arquivo de texto está restrito a apenas caracteres dentro da metade inferior dos pontos ASCII (por exemplo, 0-127), pouco importa qual codificação você escolher para seus arquivos de texto. O padrão geralmente é bom o suficiente. No entanto, se seus arquivos de texto podem conter qualquer Unicode ou qualquer caractere maior que 127, cabe a você, o desenvolvedor, conhecer a codificação. Se a codificação incorreta for especificada, o texto pode não ser importado conforme o esperado e não gerará nenhum erro. Para detalhes confusos, vou encaminhá-lo para Joel Spolsky sobre este assunto.
Escolha entre schema.ini
e MSysIMEX***
tabelas
Como você verá nos próximos artigos, ambos os métodos têm uma sobreposição bastante grande nos recursos. Portanto, você pode ter a opção de usar qualquer um. A principal diferença se resume a se você deseja que o esquema seja armazenado em seu aplicativo ou em uma pasta onde se espera que os arquivos de texto estejam. Quando você usa o
schema.ini
arquivo, você está assumindo que os arquivos de texto estarão presentes em uma determinada pasta e terão um determinado nome. Com o
MSysIMEX***
, você pode processar qualquer arquivo de texto de qualquer lugar simplesmente referenciando a especificação definida. No entanto, não é fácil editar a especificação fora do Access. Mesmo no Access, não é fácil ajustar as especificações usando a interface do usuário. O schema.ini
tem alguns recursos adicionais que não estão disponíveis diretamente com MSysIMEX***
mesas. No entanto, a questão de onde armazenar a especificação provavelmente será o fator mais importante para decidir qual usar.
Conclusão
Recomendamos que você tenha informações de esquema definidas para qualquer arquivo de texto que contenha datas ou valores monetários. As datas e os valores monetários são sensíveis à configuração regional que pode interferir na análise correta dos dados. Como temos dois sistemas diferentes com diferentes conjuntos de opções disponíveis, devemos considerar cada um nos próximos artigos. Você tem a opção de usar qualquer um (ou mesmo ambos entre diferentes arquivos de texto). Agora iremos para o
schema.ini
no próximo artigo. Mais tarde veremos MSysIMEX***
tabelas no artigo a seguir.