Jump to content

Text Parser


braincrash
 Share

Go to solution Solved by pwseo,

Recommended Posts

Bom Dia,

A ver se me conseguem dar uma dicas, já andei por aqui à procura mas não consegui encontrar o que pretendia.

Ando a tentar extrair informação de um ficheiro de texto, esse texto está segmentado por vários blocos, queria conseguir agarrar o bloco, a partir de um inicio (/START) e um fim (/END), para depois dentro deste bloco conseguir extrair dados que vão variando.

Exemplo:

/START
<cmd
restult_of_cmd
<cmd
result_of_cmd
/END
/START

<cmd
restult_of_cmd

<cmd
result_of_cmd

/END
/START

<cmd
restult_of_cmd

<cmd
result_of_cmd

/END
/START

<cmd
restult_of_cmd

<cmd
result_of_cmd

/END
/START

<cmd
restult_of_cmd

<cmd
result_of_cmd

/END

Será que me conseguem apontar para alguns tutoriais?

Obrigado.

Link to comment
Share on other sites

Sim, eu percebi que era a estrutura, mas não consegui perceber como queres guardar a informação que vais ler.

Entre cada /START e /END há um número definido ou indefinido de comandos e respectivos resultados? Cada comando começa sempre com o sinal de menor, <? Queres guardar os pares (comando, resultado) ou só um deles? A informação é para ser guardada numa lista?

São estas informações que precisamos para te podermos orientar.

Knowledge is free!

Link to comment
Share on other sites

Eu começaria por usar regex para ir buscar os blocos entre o start e o end. Depois limitava-me a utilizar o split para separar os parágrafos pelas linhas vazias e depois extraia o comando e a resposta.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

braincrash,

Podes utilizar a solução do djthyrax ou, em alternativa, podes processar o ficheiro uma linha de cada vez, decidindo se estás ou não perante um bloco delimitado por /START,/END e, dentro de cada bloco, se estás perante um comando ou um resultado.

Entretanto já passaram alguns dias desde que te responderam; conseguiste solucionar o teu problema? Se sim, como?

Link to comment
Share on other sites

  • Solution

Como nunca mais se pegou neste tópico, decidi colocar aqui a minha resposta (e marcar como resolvido). Utilizei generators para ter maior flexibilidade nos ciclos:

# encoding: UTF-8

from sys import stdin

def blocks(lines):
   # Remover o '\n' de todas as linhas
   lines = (e.strip() for e in lines)

   for l in lines:
       if l == '/START':
           block = []
       elif l == '/END':
           # Devolver um bloco e aguardar pela próxima iteração
           yield block
       else:
           block.append(l)

for b in blocks(stdin):
   print(b)

E aqui fica a execução:

~ $ # Dados originais do braincrash
~ $ python3 bc.py < bc.txt
['<cmd', 'restult_of_cmd', '<cmd', 'result_of_cmd']
['', '<cmd', 'restult_of_cmd', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'restult_of_cmd', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'restult_of_cmd', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'restult_of_cmd', '', '<cmd', 'result_of_cmd', '']
~ $
~ $ # Dados modificados para ser mais fácil identificar os diferentes blocos
~ $ python3 bc.py < bc-mod.txt
['<cmd', 'result_of_cmd1', '<cmd', 'result_of_cmd']
['', '<cmd', 'result_of_cmd2', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'result_of_cmd3', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'result_of_cmd4', '', '<cmd', 'result_of_cmd', '']
['', '<cmd', 'result_of_cmd5', '', '<cmd', 'result_of_cmd', '']
  • Vote 1
Link to comment
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
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.