Pergunta

Eu tenho um enorme conjunto de linhas de registo e eu preciso analisar cada linha (de modo a eficiência é muito importante).

Cada linha do registro é da forma

cust_name TIME_START time_end (IP ou URL) *

Assim ip endereço, tempo, tempo e uma lista possivelmente vazia de endereços IP ou URLs separados por ponto e vírgula. Se há apenas IP ou o URL na última lista não existe separador. Se lá é mais do que um, então eles são separadas por um ponto e vírgula.

Eu preciso de uma maneira de analisar esta linha e lê-lo em uma estrutura de dados. TIME_START ou time_end poderia ser qualquer hora do sistema ou GMT. cust_name também pode ter várias cadeias separados por espaços.

Eu posso fazer isso lendo caractere por caractere e, essencialmente, escrever meu próprio analisador. Existe uma maneira melhor de fazer isso?

Foi útil?

Solução

Outras dicas

Eu tive sucesso com impulso Tokenizer para este tipo de coisa. Ele ajuda a quebrar um fluxo de entrada em tokens com separadores de costume entre os tokens.

Usando expressões regulares (boost::regex é uma boa aplicação para C ++), você pode facilmente separar diferentes partes de sua corda - cust_name, time_start ... e encontrar tudo o que urls \ ips

O segundo passo é mais detalhada análise de que os grupos se necessário. Datas, por exemplo, você pode analisar usando a biblioteca boost::datetime (escrevendo analisador personalizado se o formato de cadeia não é padrão).

Por que você quer fazer isso em C ++? Parece uma tarefa óbvia para algo como perl.

entrada personalizada exige analisador personalizado. Ou, ore para que haja um mundo ideal e erros não existem. Especialmente, se você quer ter eficiência. Publicação de algum código pode ser de ajuda.

para tal um simples gramática você pode usar divisão, dar uma olhada em http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

Atualizar resposta mudou drasticamente!

Eu tenho um enorme conjunto de linhas de registo e eu preciso analisar cada linha (assim a eficiência é muito importante).

Esteja ciente de que C ++ não vai ajudar muito em termos de eficiência nesta situação. Não se iluda pensando que só porque você tem um código rápido de análise em C ++ que seu programa terá alta performance!

A eficiência que você realmente precisa aqui não é o desempenho no nível do "código de máquina" do código de análise, mas a nível global algoritmo.

Pense no que você está tentando fazer.
Você tem um arquivo de texto enorme, e você deseja converter cada linha para uma estrutura de dados,

Armazenamento enorme estrutura de dados na memória é muito ineficiente , não importa o idioma que você está usando!

O que você precisa fazer é "buscar" uma linha de cada vez, convertê-lo para uma estrutura de dados, e lidar com ele, então, e só depois que você fez com a estrutura de dados, você ir buscar a próxima line e convertê-lo para uma estrutura de dados, lidar com ele, e repita.

Se você fizer isso, você já resolveu o grande gargalo.

Para analisar a linha de texto, parece que o formato dos dados é bastante simplista, confira uma pergunta semelhante que eu pedi um tempo atrás: C ++ análise de cadeia (estilo python)

No seu caso, eu suponho que você poderia usar um fluxo de corda, e usar o operador >> para ler o próximo "coisa" na linha.

esta resposta por exemplo código.

Como alternativa, (eu não deseja excluir esta parte !!) Se você poderia escrever isso em python será muito mais simples. Eu não sei a sua situação (parece que você está preso com C ++), mas ainda

Olhe para esta apresentação para fazer esses tipos de tarefa de forma eficiente usando geradores expressões Python: http: / /www.dabeaz.com/generators/Generators.pdf

É uma pena ler. No slides 31 ele lida com o que parece ser algo muito semelhante ao que você está tentando fazer.

Ele vai pelo menos dar-lhe alguma inspiração.
Ele também demonstra fortemente que o desempenho se ganha não pelo código de análise de cadeia particular, mas o excesso todo o algoritmo.

Você poderia tentar usar um simples lex / yacc |. Flex / bison vocabulário para analisar este tipo de entrada

O analisador você precisa sons realmente simples. Dê uma olhada nisso. Qualquer linguagem compilada deve ser capaz de analisá-lo em muito alta velocidade. Então é uma questão do que estrutura de dados que você constrói e economize.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top