Question

J'ai un très grand nombre de lignes de journal et je dois analyser chaque ligne (donc l'efficacité est très important).

Chaque ligne de journal est de la forme

cust_name time_start time_end (IP ou URL) *

Donc, l'adresse IP, l'heure, l'heure et une liste éventuellement vide d'adresses IP ou d'URL séparées par des points-virgules. S'il n'y a que l'ip ou l'url dans la dernière liste, il n'y a pas de séparateur. S'il y a est supérieur à 1, ils sont séparés par des points-virgules.

J'ai besoin d'un moyen d'analyser cette ligne et de la lire dans une structure de données. time_start ou time_end peut être l'heure système ou l'heure GMT. cust_name peut aussi avoir plusieurs chaînes séparés par des espaces.

Je peux le faire en lisant caractère par caractère et en écrivant essentiellement mon propre analyseur. Y a-t-il une meilleure façon de faire cela?

Était-ce utile?

La solution

Autres conseils

J'ai eu du succès avec Boost Tokenizer pour ce genre de chose. Il vous aide à diviser un flux d’entrée en jetons avec des séparateurs personnalisés entre les jetons.

L'utilisation d'expressions régulières ( boost :: regex est une bonne implémentation pour C ++), vous pouvez facilement séparer les différentes parties de votre chaîne - nom_ cust, time_start ... et rechercher tout ce qui urls \ ips

La deuxième étape consiste en une analyse plus détaillée de ces groupes si nécessaire. Vous pouvez par exemple analyser les dates à l'aide de la bibliothèque boost :: datetime (écrire un analyseur personnalisé si le format de chaîne n'est pas standard).

Pourquoi voulez-vous faire cela en C ++? Cela ressemble à un travail évident pour quelque chose comme Perl.

Envisagez d'utiliser un bibliothèque Expressions régulières ...

Les entrées personnalisées exigent un analyseur personnalisé. Ou, priez pour qu'il y ait un monde idéal et que les erreurs n'existent pas. Spécialement si vous voulez avoir de l'efficacité. Publier du code peut être utile.

pour une grammaire aussi simple, utilisez split, consultez http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

UPDATE a radicalement changé de réponse!

  

J'ai un grand nombre de lignes de journal et j'ai besoin d'analyser chaque ligne (l'efficacité est donc très importante).

Sachez simplement que C ++ n’aidera pas beaucoup en termes d’efficacité dans cette situation. Ne vous fiez pas à l'idée que votre programme sera très performant simplement parce que vous avez un code d'analyse rapide en C ++!

L’efficacité dont vous avez vraiment besoin ici n’est pas la performance au niveau du " code machine " niveau du code d'analyse, mais au niveau global de l'algorithme.

Pensez à ce que vous essayez de faire.
Vous avez un énorme fichier texte et vous voulez convertir chaque ligne en structure de données,

Stocker une énorme structure de données en mémoire est très inefficace , quelle que soit la langue utilisée!

Ce que vous devez faire, c'est "chercher". une ligne à la fois, convertissez-la en une structure de données et gérez-la ensuite, et seulement après avoir terminé la structure de données, vous allez chercher la ligne suivante et la convertissez en une structure de données, gérez-la. et répétez.

Si vous faites cela, vous avez déjà résolu le goulot d'étranglement majeur.

Pour analyser la ligne de texte, il semble que le format de vos données soit assez simpliste. Consultez une question similaire que j'ai déjà posée il y a quelque temps: Analyse de chaîne C ++ (style python)

Dans votre cas, je suppose que vous pouvez utiliser un flux de chaîne et utiliser l'opérateur > > pour lire le " thing " suivant. dans la ligne.

voir cette réponse pour obtenir un exemple de code.

Alternativement, (je ne voulais pas supprimer cette partie !!) Si vous pouviez écrire ceci en python, ce serait beaucoup plus simple. Je ne connais pas votre situation (il semble que vous soyez coincé avec C ++), mais quand même

Consultez cette présentation pour effectuer efficacement ce type de tâche à l'aide des expressions du générateur Python: http: / /www.dabeaz.com/generators/Generators.pdf

Cela vaut la peine d'être lu. À la diapositive 31, il traite de ce qui semble être quelque chose de très similaire à ce que vous essayez de faire.

Cela vous donnera au moins une inspiration.
Cela démontre également très clairement que les performances ne sont pas gagnées par le code d’analyse de chaînes particulier, mais par l’algorithme global.

Vous pouvez utiliser un vocabulaire simple lex / yacc | flex / bison pour analyser ce type de saisie.

L’analyseur dont vous avez besoin semble très simple. Jetez un coup d'œil à cela. Tout langage compilé doit pouvoir être analysé à partir de très grande vitesse. Il s’agit ensuite de la structure de données que vous construisez & amp; enregistrer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top