Black november Você e seu amigo por apenas 49,90 por mês! Saiba mais

Programa C -> de XML para sqlite

12/07/2019

10

Prezados, boa noite!

Preciso criar um programa em C (ou C++) que, de forma bem resumida, faça o seguinte:

Para cada arquivo contido em determinado diretório informado (ou selecionado):
Se o arquivo for XML então:
Abrir o arquivo;
Ler o conteúdo de alguns nós e sub-nós, atribuindo-o a variáveis de memória;
Gravar o conteúdo das variáveis de memória em tabelas criadas no banco de dados SQlite.

Eu consegui fazer todo o procedimento acima em Excel VBA, porém a execução está bastante demorada.

Como são muitos arquivos XML a serem lidos, gostaria de tentar fazer em C (ou C++), esperando que fique mais rápida a execução.

Li na internet um pouco sobre o pacote libxml que permite abrir e processar arquivos xml, porém não encontrei nada a respeito da sua instalação e como usá-lo num programa C (ou C++).

A mesma dificuldade estou tendo com relação à instalação e uso de algum pacote (ou biblioteca) que permita acessar o banco de dados SQLite.

Tenho instalados o Visual Studio 2019 e também o compilador MinGW.

As tabelas foram criadas diretamente no SQLite e a utilização das mesmas será feita através do SQLiteStudio. Portanto, o programa a ser criado em C será apenas para popular as tabelas (comandos INSERT).

Se alguém puder ajudar, ao menos, com o básico , ficarei bastante grato.
Responder

Post mais votado

15/07/2019

Boa André, é isso mesmo, o que falei se aplica ao C#, não ao C.

Mas se tua preocupação é em ter um executável (.exe), não deve se preocupar, pois o C# é capaz de gerar um executável. Se usar o .NET Core pode até gerar um executável para rodar em Linux e Mac, além do Windows, claro.

Esse .exe você pode rodar da linha de comando, se você criar uma aplicação desktop padrão do C#.

Claro que você terá dependência na biblioteca do .NET, mas aquele #include que você relatou no exemplo em C é exatamente isso, a dependência em uma biblioteca externa, que você terá que copiar para a máquina que for rodas a aplicação.

Eu insisto na questão do C# .NET, porque ele é bem maduro com uma biblioteca gigante e bem documentada, além de open source.

Agora, se por algum outro motivo precisar escrever a aplicação em C mesmo, confesso que não conheço muitas bibliotecas que te ajudarão em cada etapa do teu aplicativo.

Mas só esclarecendo a dúvida que fez, o pacote tem que estar no mesmo diretório de onde ficar o executável (ou em um diretório, mas nesse caso você tem que alterar o código desse link para apontar para o diretório que escolheu). Onde baixar, só fazendo uma busca na internet. Os pacotes do C# estão (praticamente) todos no NuGet, mas o C não tem nenhum repositório oficial, então vale buscar no GitHub, ou no Google mesmo.

Bom, espero ter ajudado de alguma forma.

Qualquer coisa, estamos aí!


Arão, boa noite!

Inicialmente eu comecei fazendo a importação dos dados dos arquivos XML para planilha do Excel, utilizando o VBA.
Porém, devido à limitação do Excel quanto ao número máximo de linhas (um pouco mais de um milhão de linhas), surgiu a necessidade de importar os dados para um banco de dados.
Optei pelo sqlite devido à facilidade de uso (por exemplo, não requer instalação).
Pesquisando na internet, encontrei soluções para usar no excel de forma a conseguir, via código VBA, gravar os dados lidos do XML para tabelas do sqlite.
O código VBA funciona corretamente, porém todo o processo está demorado.
Pensei em C na expectativa de que fique extremamente veloz a operação.
Nesse ponto, eu te pergunto.
Você acredita que um programa em C# fará a tarefa bem mais rápido que o VBA?
Sobre o C++, eu consegui bons avanços nos últimos dias.
Novamente pesquisando na internet, e utilizando o método da tentativa e erro, consegui instalar o pacote libxml e utilizá-lo num pequeno programa em C++.
Sofri um pouco, mas no final deu certo.
Consegui também listar todos os arquivos de um diretório utilizando as funções contidas em dirent.h.
Muita coisa ainda terei que pesquisar e aprender, mas um passo de cada vez.
Com esses avanços, pretendo insistir um pouco mais no C++, porém se surgir algum obstáculo intransponível, pensarei na opção do C#.
Forte abraço.


Responder

Mais Posts

12/07/2019

Arão Garcéa

Fala André, beleza?

Cara, para você fazer isso você precisa:

1. Listar os arquivos no diretório;
2. Iterar pelos arquivos verificando se tem a extensão XML;
3. Se for XML, achar o(s) nó(s) que tem(êm) o(s) dado(s) que você precisa; e
4. Inserir os dados no SQLite.

Para cada um desses itens, há ferramentas que podem te auxiliar.

Para o item 1, sugiro ler esse artigo (https://www.dotnetperls.com/directory-getfiles). Está em inglês, mas é bem direto ao ponto.

Para o item 2, você vai usar um "foreach" no array criado na etapa anterior, nada de novo sob o sol.

O item 3 eu diria que é o mais complicado, até porque você precisa saber qual o nó que você quer. O recurso que você procura se chama LINQ em sua versão LINQ to XML. O LINQ é uma série de "métodos", dentro do .NET, para simplificação de algoritmos de busca em estruturas de dados e, quando se aprende sobre ele, fica bem fácil achar os dados que quer. Mas como é um assunto um pouco mais complexo, sugiro que poste mais especificamente o que precisa no XML (a estrutura dele e quais nós precisa) para poder ajudar com um exemplo.

Para o item 4, o mais simples é você continuar no LINQ, mas aí usando a variação LINQ to SQL, onde você pode criar um DataContext com a string de conexão ao banco e através dela popular um objeto que modele a tabela que você quer incrementar no banco. Ou seja, você cria uma classe que modele a tabela (usando o atributo [Table] na classe e [Column] nas propriedades (contanto que o nome da tabela seja idêntico ao nome da classe, e os nomes das propriedades sejam idênticos aos nome das colunas; senão você tem que adicionar, por exemplo, [Table(Name="NomeDaTabela")] )), e depois você pode "colocar na memória" a tabela usando GetTable<> no contexto e adicionar novos registros usando o método InsertOnSubmit() na tabela.

Para aprender um pouco do LINQ, o melhor lugar é sempre a documentação no site da Microsoft (iniciando aqui: https://docs.microsoft.com/pt-br/dotnet/api/system.data.linq?view=netframework-4.8).

Qualquer dúvida, posta os detalhes para dar exemplos.

Boa sorte!
Responder

13/07/2019

Andre Silva

Fala André, beleza?

Cara, para você fazer isso você precisa:

1. Listar os arquivos no diretório;
2. Iterar pelos arquivos verificando se tem a extensão XML;
3. Se for XML, achar o(s) nó(s) que tem(êm) o(s) dado(s) que você precisa; e
4. Inserir os dados no SQLite.

Para cada um desses itens, há ferramentas que podem te auxiliar.

Para o item 1, sugiro ler esse artigo (https://www.dotnetperls.com/directory-getfiles). Está em inglês, mas é bem direto ao ponto.

Para o item 2, você vai usar um "foreach" no array criado na etapa anterior, nada de novo sob o sol.

O item 3 eu diria que é o mais complicado, até porque você precisa saber qual o nó que você quer. O recurso que você procura se chama LINQ em sua versão LINQ to XML. O LINQ é uma série de "métodos", dentro do .NET, para simplificação de algoritmos de busca em estruturas de dados e, quando se aprende sobre ele, fica bem fácil achar os dados que quer. Mas como é um assunto um pouco mais complexo, sugiro que poste mais especificamente o que precisa no XML (a estrutura dele e quais nós precisa) para poder ajudar com um exemplo.

Para o item 4, o mais simples é você continuar no LINQ, mas aí usando a variação LINQ to SQL, onde você pode criar um DataContext com a string de conexão ao banco e através dela popular um objeto que modele a tabela que você quer incrementar no banco. Ou seja, você cria uma classe que modele a tabela (usando o atributo [Table] na classe e [Column] nas propriedades (contanto que o nome da tabela seja idêntico ao nome da classe, e os nomes das propriedades sejam idênticos aos nome das colunas; senão você tem que adicionar, por exemplo, [Table(Name="NomeDaTabela")] )), e depois você pode "colocar na memória" a tabela usando GetTable<> no contexto e adicionar novos registros usando o método InsertOnSubmit() na tabela.

Para aprender um pouco do LINQ, o melhor lugar é sempre a documentação no site da Microsoft (iniciando aqui: https://docs.microsoft.com/pt-br/dotnet/api/system.data.linq?view=netframework-4.8).

Qualquer dúvida, posta os detalhes para dar exemplos.

Boa sorte!


Olá, Arão! Bom dia!

Obrigado pelas dicas.

Corrija-me se eu estiver enganado, mas me parece que suas sugestões seriam para serem utilizadas em programa feito em C#.
Em princípio, pretendo utilizar Linguagem C (ou C++), ou seja, um programa (.exe) a ser executado a partir da linha de comando, que não necessitará de nenhuma máquina virtual para rodar.
Antes pensei em fazer em java, porém ficaria dependente de ter a JVM instalada na máquina na qual será executado o programa.

Sobre como acessar um XML, no link abaixo tem um exemplo de um código no qual é feita a leitura de nós contidos em um arquivo XML a partir de um programa C.
http://mindbending.org/pt/processando-arquivos-xml-java-vs-python-vs-c

No início do programa o autor inclui a seguinte cláusula:
#include <libxml/parser.h>

Sei que no meu programa, teria que haver cláusula semelhante. Porém ainda não consegui esclarecer de onde baixar o pacote libxml e como instalá-lo em meu PC (qual diretório, por exemplo) para que o compilador "C" o reconheça.


Responder

13/07/2019

Arão Garcéa

Boa André, é isso mesmo, o que falei se aplica ao C#, não ao C.

Mas se tua preocupação é em ter um executável (.exe), não deve se preocupar, pois o C# é capaz de gerar um executável. Se usar o .NET Core pode até gerar um executável para rodar em Linux e Mac, além do Windows, claro.

Esse .exe você pode rodar da linha de comando, se você criar uma aplicação desktop padrão do C#.

Claro que você terá dependência na biblioteca do .NET, mas aquele #include que você relatou no exemplo em C é exatamente isso, a dependência em uma biblioteca externa, que você terá que copiar para a máquina que for rodas a aplicação.

Eu insisto na questão do C# .NET, porque ele é bem maduro com uma biblioteca gigante e bem documentada, além de open source.

Agora, se por algum outro motivo precisar escrever a aplicação em C mesmo, confesso que não conheço muitas bibliotecas que te ajudarão em cada etapa do teu aplicativo.

Mas só esclarecendo a dúvida que fez, o pacote tem que estar no mesmo diretório de onde ficar o executável (ou em um diretório, mas nesse caso você tem que alterar o código desse link para apontar para o diretório que escolheu). Onde baixar, só fazendo uma busca na internet. Os pacotes do C# estão (praticamente) todos no NuGet, mas o C não tem nenhum repositório oficial, então vale buscar no GitHub, ou no Google mesmo.

Bom, espero ter ajudado de alguma forma.

Qualquer coisa, estamos aí!
Responder

17/07/2019

Arão Garcéa

Legal André, confesso que comecei a aprender assim também, fazendo funcionar (do jeito que for!) rs.

Sobre o C#, com certeza, na verdade qualquer linguagem de programação consegue fazer 1 milhão de registros bem rápido. O que deve estar atrasando seu programa em VBA é que deve estar usando funções do Excel, o que torna tudo bem mais lento.

Olha só, assim como o C# é uma linguagem e o .NET é um conjunto de "funcionalidades" para usar na programação, o VBA é um subconjunto da linguagem VB, que também pode acessar o .NET, mas também pode acessar outros conjuntos de "funcionalidades" do Office, por exemplo.

O problema é que as funcionalidades de um framework como o .NET são feitas para rodarem na velocidade do computador (milhares de operações por milissegundo), e as funcionalidades do Office são feitas para rodarem na velocidade do usuário (alguns segundos por operação) (aqui eu exagerei um tanto, mas partir dessa premissa não está errado).

Agora, quanto ao C e ao C++, não tem o que falar, são feitos para rodarem no limite da CPU. Mas o C# está na mesma ordem de grandeza em termos de velocidade, não há uma perda perceptível. Digamos que esse programa que você quer rodar, após pronto e compilado, deve durar alguns segundos para rodar, vamos dizer uns 100 segundos, dependendo de como organizou ele. Todas essas 3 linguagens devem ter um desempenho similar.

O que eu vejo como as maiores vantagens de se usar o C# são: tem uma biblioteca de "funcionalidades" muito maior para você usar; tem um conjunto de informações (aulas, artigos, livros, vídeos, etc.) muito maior para sua referência (aqui alguns podem discordar, mas se pensar em materiais recentes não tenho muita dúvida de estar certo); agora, mais importante, tem a vantagem de que é uma linguagem em pleno ciclo de vida, sendo atualizada todo ano com grande repercussão nos círculos de programadores, o que te dá muito mais perspectiva de usar seus novos conhecimentos em outros projetos.

Dito isso, eu aprendi a programar em C, e, depois, quando resolvi aprender C#, parecia que já conhecia a linguagem há muito tempo, então acho que não tem erro em fazer tua aplicação em C ou C++ e depois, se precisar desenvolver outra aplicação, passe para o C#.

Cara, se está conseguindo evoluir, uhúu!, programação é isso, montar a máquina e botar ela para girar!

Abraço!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar