Jump to content
rtavix

Ler arquivo e inserir no banco

Recommended Posts

Preciso ler um arquivo e salvar o campo de Data de agendamento, valor do Documento, protocolo, código de barras, Registro: gravar data e hora, como poderia está fazendo? Segue meu código em anexo. O arquivo pode ser aberto no txt, porém não consigo anexar. Dentro desse arquivo eu possuo diversos comprovantes, deixei somente dois como base na explicação. Preciso de ajuda por gentileza. 

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ServicoProcessamentoComprovantes
{
    public class ProcessaRetorno
    {
        private static object objReader;

        private static void Main(string[]args)
        {
            List<string> valoresEncontrados = new List<string>();

            try
            {
                string[] Arquivo = System.IO.Directory.GetFiles(@"\\S3A601\ftp@sefarix\forem\Saida_SDPJ\teste", "*.cpv");

                foreach(var item in Arquivo)
                {
                    string[] linha = item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    if(linha.Length >=3)
                    {
                        valoresEncontrados.Add(linha[2]);
                    }
                }
            }
            catch(Exception ex)
            {

            }
        }
    }
}

Dados do arquivo:

 

------------------------------------------------

CONTAK TECNOLOGIA SA

--------------CONTAK CORPORATIVO--------------

    Pagamentos e Transferencias Eletronicas

 

PAGAMENTO: DEPOSITO JUDICIAL               

------------------------------------------------

Cliente:        José Frederico Costa e Silva               

                Enc Ger APLIX - Cta C          

Conta:          5.535.0125

Agencia:        104-Central                       

 

Cod. Barras:    898800000078  000002130424

                017092700009  270400028680

Conveniada:     DEPOSITO JUDICIAL               

 

Dt.Agendamento: 29/09/2017

Vlr.Documento:  R$500,00

Protocolo:      94651134

 

Origem:         CONTAK CORPORATIVO

================================================

             TRANSACAO EFETIVADA 

================================================

Registro: 29/09/2017 11:21:29  /local/home/tef/d/20170929/sfcg012.

Emissao.: 30/09/2017 09:54:19 

------------------------------------------------

CONTAK TECNOLOGIA SA

--------------CONTAK CORPORATIVO--------------

    Pagamentos e Transferencias Eletronicas

 

PAGAMENTO: DEPOSITO JUDICIAL               

------------------------------------------------

Cliente:        José Frederico Costa e Silva                

                Enc Ger APLIX- Cta C          

Conta:          5.535.018

Agencia:        104-Central                       

 

Cod. Barras:    898300000032  500002140426

                017092700009  577000029380

Conveniada:     DEPOSITO JUDICIAL               

 

Dt.Agendamento: 29/09/2017

Vlr.Documento:  R$350,00

Protocolo:      94651136

 

Origem:         CONTAK CORPORATIVO

================================================

             TRANSACAO EFETIVADA 

================================================

Registro: 29/09/2017 11:21:29  /local/home/tef/d/20170929/sfcg012.

Emissao.: 30/09/2017 09:54:19 

Edited by rtavix
Alterar informação

Share this post


Link to post
Share on other sites

Se o arquivo for normalizado, com campos bem definidos você pode mapear isso tudo numa classe. O negócio é que você precisa identificar as linhas e assim setar as propriedades.

 

Digamos que você possui uma classe Comprovante:

class Comprovante
{
	public DateTime DataAgendamento{get;set;}
  	public Decimal ValorDocumento{get;set;}
  	public String Protocolo{get;set;}
  	public String CodigoBarras{get;set;}
  	public DateTime DataRegistro{get;set;}
}

Seria necessário ler o arquivo linha a linha e ir identificando e criando os objetos da classe Comprovante. Para isso também seria necessário alguma forma de identificar o fim de um comprovante, se houver mais de um por arquivo.

 

using(FileStream fs = new FileStream("arquivo.cpv", FileMode.Open)) 
{
 using(StreamReader sr = new StreamReader(fs)) 
 {
  var linha = "";
  var fimDoComprovante = "@FIM@"; // alguma forma de identificar o fim do comprovante
  var comprovanteLista = new List < Comprovante > ();
  var comprovante = new Comprovante();
  while ((linha = sr.ReadLine()) != null) 
  {
   if (linha.StartsWith("Cod. Barras")) 
   {
    comprovante.CodigoBarras = linha.Split(':')[1];
   }

   if (linha.Contains("@FIM@")) 
   {
    comprovanteLista.Add(comprovante);
    comprovante = new Comprovante();
   }
  }
 }
}

Use apenas como uma ideia de como fazer, não faça tão sujo assim! :p

Share this post


Link to post
Share on other sites
10 horas atrás, Kelvin Dules disse:

Se o arquivo for normalizado, com campos bem definidos você pode mapear isso tudo numa classe. O negócio é que você precisa identificar as linhas e assim setar as propriedades.

 

Digamos que você possui uma classe Comprovante:


class Comprovante
{
	public DateTime DataAgendamento{get;set;}
  	public Decimal ValorDocumento{get;set;}
  	public String Protocolo{get;set;}
  	public String CodigoBarras{get;set;}
  	public DateTime DataRegistro{get;set;}
}

Seria necessário ler o arquivo linha a linha e ir identificando e criando os objetos da classe Comprovante. Para isso também seria necessário alguma forma de identificar o fim de um comprovante, se houver mais de um por arquivo.

 


using(FileStream fs = new FileStream("arquivo.cpv", FileMode.Open)) 
{
 using(StreamReader sr = new StreamReader(fs)) 
 {
  var linha = "";
  var fimDoComprovante = "@FIM@"; // alguma forma de identificar o fim do comprovante
  var comprovanteLista = new List < Comprovante > ();
  var comprovante = new Comprovante();
  while ((linha = sr.ReadLine()) != null) 
  {
   if (linha.StartsWith("Cod. Barras")) 
   {
    comprovante.CodigoBarras = linha.Split(':')[1];
   }

   if (linha.Contains("@FIM@")) 
   {
    comprovanteLista.Add(comprovante);
    comprovante = new Comprovante();
   }
  }
 }
}

Use apenas como uma ideia de como fazer, não faça tão sujo assim! :p

Opa Kelvin, bom dia, tentarei aplicar essas funcionalidades implementadas por você ao meu código e darei um retorno em breve, tentei anexar o arquivo, porém não é permitido anexo de arquivo de texto, somente de imagem rsrs, daí postei o arquivo no escopo mesmo da descrição. VocÊ poderia me ajudar em uma outra situação?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By fernandoxwiggy
      Bom dia,
      Alguém já teve que desenvolver o CIOT da empresa E-frete em C#?
       
      Estou buscando exemplos de como fazer usando o web service deles (http://dev.efrete.com.br/Services/LogonService.asmx).
      Eu acredito que preciso chamar o "login" (depois o logout) dentro desse web service, mas ele é uma interface e não estou achando um exemplo de chamar um procedimento em um web service que seja um interface.
       
      Agradeço desde já se alguém puder ajudar.
    • By User386_Denilson
      e aí pessoal, blz?
       
      Vou colocar aqui minha duvida...
      Tenho um projeto em net Core 2.2, usadon mongodb. Tenho uma collection antiga (Pessoas) que o pessoal foi alimentado com muita coisa, e agora estou organizando em pessoa fisica e pessoa juridica.
      Eu faço a busca usando o filtro por id:
      public async Task<PessoaDadosCad> GetPessoaFisica(string id) { var pessoa = await passaiMongoCollection.FindAsync(pessoa => pessoa.Id == id); var data = JsonConvert.SerializeObject(await pessoa.FirstOrDefaultAsync()); PessoaDadosCad simplifiedPerson = JsonConvert.DeserializeObject<PessoaDadosCad>(data.ToString()); return simplifiedPerson; }  
      (pessoa => pessoa.Id == id) ao executar esse comando de busca, a classe vinculada é Pessoa.
      Eu queria ver com vcs se tem como não vincular uma classe no momento da busca??
      Obrigado
    • By rdavisp
      Senhores, boa tarde.

      Pesquisei muito antes de abrir esse post, inclusive aqui, neste fórum. Encontrei dúvidas parecidas as quais tentei adaptar ao meu caso porem sem sucesso.

      A questão é a seguinte:

      Foi desenvolvida uma API em ASP.NET Core 2.0, mas por algumas solicitações do cliente, necessitei migrar para a versão 3.1. Existe uma SPA em Angular 7 que faz a requisição à API através de um método POST passando os parâmetros para a API que retornava um conjunto de dados para aplicação montar a tela. Após a atualização parou de funcionar! Por isso, gostaria de pedir a ajuda de vocês, por que, eu já esgotei as minhas tentativas.

      **No Controller da API está da seguinte maneira:**
       
      1 2 3 4 5 6 7 8 [HttpPost] [Route("api/[controller]")] public IGResult Post(Filtro filtro) {     Console.WriteLine("filtro: " + filtro);     var app = new IgApplication();     return app.getInstrucoes(filtro); }
      **E no angular se encontra dessa forma:**
       
      1 return this._http.post<IgResult>(environment.url + 'api/IG',  this.Filtro, options)

      Ao debugar a API, percebo que os dados do parâmetro **body** chegam nulos. Já tentei das seguintes maneiras abaixo, mudar a implementação do POST na API porém sem sucesso:
       
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 > //public async Task<IActionResult> Post([FromBody] Filtro pessoa) >         //public HttpResponseMessage Post(Filtro pessoa) >         //public async Task<ActionResult<IList<Todo>>> Create([FromBody]TodoCreateViewModel model) >         //public Task<IActionResult> Post([FromBody] Filtro filtro) >         //public ActionResult<Filtro> Post([FromBody] Filtro filtro) >         //public HttpResponseMessage Post(Filtro filtro) >         //public string Post([FromBody] Filtro filtro) >         //public IActionResult Post([FromBody] Filtro filtro) >         //{ >         //var app = new IgApplication(); >         //return app.getInstrucoes(filtro); >         //return null;// Json(filtro); >         //} >         //public async System.Threading.Tasks.Task<string> Post(HttpRequestMessage request) >         //{ >         //    string body = await request.Content.ReadAsStringAsync(); >         //    return body; >         //}

      Por isso se possível, gostaria muito de contar com a colaboração de vocês.

      Desde já muito obrigado!
    • By rdavisp
      Senhores, bom dia.
      Mais uma vez recorro a ajuda de vocês para algo que não domino ainda. Vamos lá!
      Tenho uma API que quando startada, ela sobe no seguinte endereço: http://localhost:49013/api/values. Percebi que isto é parametrizado no arquivo launchSettings.json, que está assim:
       
      {   "iisSettings": {     "windowsAuthentication": false,     "anonymousAuthentication": true,     "iisExpress": {       "applicationUrl": "http://localhost:49013/",       "sslPort": 0     }   },   "profiles":    {     "IIS Express": {       "commandName": "IISExpress",       "launchBrowser": true,       "launchUrl": "api/values",       "environmentVariables": {         "ASPNETCORE_ENVIRONMENT": "Development"       }     },     "Cliente.IG.WebAPI": {       "commandName": "Project",       "launchBrowser": true,       "launchUrl": "api/values",       "environmentVariables": {         "ASPNETCORE_ENVIRONMENT": "Development"       },       "applicationUrl": "http://localhost:49012/"     }   } }  
      No meu controller da API, tenho seguinte método dentro do namespace:
       
          [Produces("application/json")]     [Route("api/IG")]     [ApiController]     public class IGController : Controller     {         [HttpPost]         public IGResult Post([FromBody] Filtro filtro)         {             var app = new IgApplication();             return app.getInstrucoes(filtro);         }     }  
      O "IgApplication" cria uma instância da classe onde é gerado uma lista que é populada com os valores atribuídos do DAO.
       
      Quando inicializo a aplicação "A" em angular através do localhost (http://localhost:4200/). Dentro do meu arquivo environment.prod.ts tenho a chamada:
       
      export const environment = {   production: true,   url: 'http://localhost:49013/' };  
      Ela passa por esse controller e segue o fluxo e faz o que tem que ser feito. 
      Porém, eis a questão! Eu possuo a aplicação "B", que acessa a mesma API porém possui funcionalidades diferente, por isso, dentro do mesmo controller eu criei uma nova classe e um método:
       
          [Produces("application/json")]     [Route("api/Item")]     public class APIIgItemController : Controller     {         [HttpGet]         public ItensResult Post([FromBody] Itens ValorItem)         {             var app = new CRUDApplication();             return app.GetItens();         }     }  
      Como faço para quando for startar a aplicação "B", ele passe por esse método "ItensResult" ao invés "IGResult", sendo que ambas são executadas pelo localhost:4200? Ou isso eu defino na aplicação angular? Vi que é possível configurar mais de uma "applicationUrl" dentro do json. Devo considerar essa configuração?
       
      Grato a quem puder ajudar!
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.