none
Como pegar caracteres de acordo com linha ? RRS feed

  • Pergunta

  • Boa tarde pessoal, estou criando um programa pra processar arquivos mas ele não obedece a um padrão de  tabulação.

    17:19:04 [CGS LIDJ408C3AF]                      Pedido de controle Fechar  - LIDJ4-08    Cmd Abrir/Fechar                                                       [2]        
    17:19:05 [CGS LIDJ408C3AF]                      Sucesso resultado do controle supervisorio  - LIDJ4-08    Cmd Abrir/Fechar                                      [3 ADV] 

    Antes eu fazia assim:

                            descricao = linha.Substring(78, 12)
                            descricao = descricao.TrimStart()
                            descricao = descricao.TrimEnd()

    Fazia com que eu pegava de uma determinada posição até certo tamanho, mas agora não obedecem a isso e a lista de arquivos é grande. Como faço para pegar por exemplo:

    Se a linha tiver "Cmd", aí armarzena na variável de "Cmd" até "Fechar" ficando assim armazenado na variável só "Cmd Abrir/Fechar" e fazer o mesmo com "-" a partir do "-" armazenar até antes de "C" ou alguma variável q aparece. Fazendo os cortes com trimstart e trimend pra ficar só "LIDJ4-08" ?

    Quem puder ajudar, desde já, agradeço!



    quarta-feira, 23 de novembro de 2016 19:04

Respostas

  • Realmente Filipe, acabei invertendo um sinal de - por +. Segue agora, acabei de testar:

    Dim info1 As String = linha.Substring(linha.IndexOf("-")+1, linha.IndexOf("Cmd") - linha.IndexOf("-")-1).Trim()
    Dim info2 As String = linha.Substring(linha.IndexOf("Cmd"), linha.LastIndexOf("[") - linha.IndexOf("Cmd")).Trim()


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:33
    • Não Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:33
    • Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:38
    quarta-feira, 23 de novembro de 2016 20:58
  • Sim, explico.

    Pra ficar mais simples, o meu código faz quase a mesma coisa que o seu fazia lá na sua pergunta, porém ao invés de eu fixar qual é o início e o tamanho da substring que eu quero, eu faço isso de forma dinâmica. O método IndexOf pega qual é a posição de determinado caractere dentro da string e essa função retorna um numero inteiro.

    Por exemplo:

    Dim nome As String = "Filipe"
    Dim posicao As Integer = nome.IndexOf("p")
    
    

    Esse código, pega a posição da letra p dentro da string "Filipe". Nesse caso ele irá retornar o número 4 que é a posição (lembrando que começa a contar do 0)

    Portanto tudo o que fiz no código foi operações para encontrar as posições dos caracteres que delimitavam o que você queria para poder ter a posição numérica deles e retornar apenas a parte que desejava.

    Ficou mais claro?

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta Filipe Lobato quinta-feira, 24 de novembro de 2016 14:51
    quinta-feira, 24 de novembro de 2016 02:18

Todas as Respostas

  • Olá Filipe,

    Realmente, trabalhar com arquivos não padronizados é bem ruim, tenta ver se assim te ajuda:

    string info1 = linha.Substring(linha.IndexOf('-'), linha.IndexOf("Cmd") - linha.IndexOf('-')).Replace("-","").Trim();
    string info2 = linha.Substring(linha.IndexOf("Cmd"), linha.LastIndexOf("[") - linha.IndexOf("Cmd")).Trim();

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 23 de novembro de 2016 19:18
  • Olá Filipe,

    Realmente, trabalhar com arquivos não padronizados é bem ruim, tenta ver se assim te ajuda:

    string info1 = linha.Substring(linha.IndexOf('-'), linha.IndexOf("Cmd") - linha.IndexOf('-')).Replace("-","").Trim();
    string info2 = linha.Substring(linha.IndexOf("Cmd"), linha.LastIndexOf("[") - linha.IndexOf("Cmd")).Trim();

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    Obrigado pela dica, passei aqui para VB.NET ficou assim :

    Dim linha As String = "17:36:52 [CGS LIDJ401C3AF]                      Pedido de controle Fechar  - LIDJ4-01    Cmd  Abrir/Fechar                                                                 "
            Dim resultado, resultado2 As String
            resultado = linha.Substring(linha.IndexOf("-"), linha.IndexOf("Cmd") - linha.IndexOf("-")).Replace("-", "").Trim()

    Imprimiu 

    LIDJ401

    Só que é pra imprimir "LIDJ4-01" o único "-" a ser tirado é o antes do "L" basicamente tem que ser um código que sirva para as duas linhas. Pra ficar assim o valor das variáveis no final, por exemplo na 1ª linha:

    variavel1 = "17:36:52"
    variavel2 = "[CGS LIDJ401C3AF]"
    variavel3 = "Pedido de controle Fechar"
    variavel4 = "LIDJ4-01"
    variavel5 = "Cmd  Abrir/Fechar"




    • Editado Filipe Lobato quarta-feira, 23 de novembro de 2016 19:59
    quarta-feira, 23 de novembro de 2016 19:44
  • Estava em C#, nem reparei que era VB, agora está em VB:

    Dim info1 As String = linha.Substring(linha.IndexOf("-")+1, linha.IndexOf("Cmd") - linha.IndexOf("-")+1).Trim()
    Dim info2 As String = linha.Substring(linha.IndexOf("Cmd"), linha.LastIndexOf("[") - linha.IndexOf("Cmd")).Trim()

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco




    quarta-feira, 23 de novembro de 2016 19:57
  • Atualizei, dá uma olhada agora na resposta acima

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 23 de novembro de 2016 20:10
  • Vi aqui, está imprimindo: 

    LIDJ4-08    Cm

    Tem que imprimir: 

    LIDJ4-08

    Deixa eu te esclarecer também, o mesmo código que serve para a 1ª linha tem que servir para a 2ª. Não tem nenhuma propriedade que corte por exemplo:

    De determinada posição do caractere até onde tiver o primeiro "-" ?

    17:19:04 [CGS LIDJ408C3AF]                      Pedido de controle Fechar  - LIDJ4-08    Cmd Abrir/Fechar                                                       [2]        
     

    quarta-feira, 23 de novembro de 2016 20:27
  • Realmente Filipe, acabei invertendo um sinal de - por +. Segue agora, acabei de testar:

    Dim info1 As String = linha.Substring(linha.IndexOf("-")+1, linha.IndexOf("Cmd") - linha.IndexOf("-")-1).Trim()
    Dim info2 As String = linha.Substring(linha.IndexOf("Cmd"), linha.LastIndexOf("[") - linha.IndexOf("Cmd")).Trim()


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:33
    • Não Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:33
    • Marcado como Resposta Filipe Lobato quarta-feira, 23 de novembro de 2016 22:38
    quarta-feira, 23 de novembro de 2016 20:58
  • Produziu o resultado que eu esperava ! haha Valeu

    Senão for pedir demais, poderia me explicar a lógica desse código? Assim irei conseguir aplicar a outras exceções do arquivo. Não entendi como ele limita a string. Ou algum link, obrigado !


    • Editado Filipe Lobato quarta-feira, 23 de novembro de 2016 22:53
    quarta-feira, 23 de novembro de 2016 22:38
  • Sim, explico.

    Pra ficar mais simples, o meu código faz quase a mesma coisa que o seu fazia lá na sua pergunta, porém ao invés de eu fixar qual é o início e o tamanho da substring que eu quero, eu faço isso de forma dinâmica. O método IndexOf pega qual é a posição de determinado caractere dentro da string e essa função retorna um numero inteiro.

    Por exemplo:

    Dim nome As String = "Filipe"
    Dim posicao As Integer = nome.IndexOf("p")
    
    

    Esse código, pega a posição da letra p dentro da string "Filipe". Nesse caso ele irá retornar o número 4 que é a posição (lembrando que começa a contar do 0)

    Portanto tudo o que fiz no código foi operações para encontrar as posições dos caracteres que delimitavam o que você queria para poder ter a posição numérica deles e retornar apenas a parte que desejava.

    Ficou mais claro?

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta Filipe Lobato quinta-feira, 24 de novembro de 2016 14:51
    quinta-feira, 24 de novembro de 2016 02:18
  • Sim, entendi, valeu !
    quinta-feira, 24 de novembro de 2016 14:51