سؤال

لديّ مجموعة كبيرة من خطوط السجل وأحتاج إلى تحليل كل سطر (لذا فإن الكفاءة مهمة للغاية).

كل سطر سجل من النموذج

cust_name time_start time_end (IP أو URL)*

لذلك عنوان IP والوقت والوقت وقائمة فارغة من عناوين IP أو عناوين URL مفصولة بفواصل منقوطة.إذا كان هناك عنوان IP أو عنوان url فقط في القائمة الأخيرة، فلن يكون هناك فاصل.إذا كان هناك أكثر من 1 ، فسيتم فصلها بواسطة فاصلة فاصلة.

أحتاج إلى طريقة لتحليل هذا السطر وقراءته في بنية البيانات.time_start أو time_end يمكن أن يكون وقت النظام أو GMT.يمكن أن يكون Cust_name أيضًا سلاسل متعددة مفصولة بالمسافات.

يمكنني القيام بذلك عن طريق قراءة حرف بحرف وكتابة المحلل اللغوي الخاص بي.هل هناك طريقة أفضل للقيام بذلك ؟

هل كانت مفيدة؟

نصائح أخرى

لقد حققت النجاح مع تعزيز الرمز المميز لهذا النوع من الشيء.يساعدك على تقسيم دفق الإدخال إلى الرموز المميزة مع فواصل مخصصة بين الرموز المميزة.

<ع> استخدام التعابير العادية (boost::regex هو تطبيق لطيفة لC ++)، يمكنك بسهولة فصل أجزاء مختلفة من سلسلة الخاص بك - cust_name, time_start ... وتجد كل ما عناوين \ IPS

والخطوة الثانية هي تحليل أكثر تفصيلا من تلك الجماعات إذا لزم الأمر. مواعيد سبيل المثال يمكن تحليل باستخدام مكتبة boost::datetime (كتابة محلل مخصص إذا تنسيق سلسلة غير القياسية).

وماذا تريد أن تفعل هذا في C ++؟ هذا يبدو وكأنه وظيفة واضحة عن شيء مثل بيرل.

فكر في استخدام أ مكتبة التعبيرات العادية...

والمدخلات مخصص يطالب محلل مخصص. أو، نصلي من اجل ان يكون هناك عالم مثالي والأخطاء لا وجود لها. خاص، إذا كنت تريد أن يكون الكفاءة. نشر بعض التعليمات البرمجية قد تكون عونا.

ولمثل هذه القواعد بسيطة يمكنك استخدام الانقسام، وإلقاء نظرة على الموقع http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

تحديث تغيرت الإجابة بشكل جذري!

لدي مجموعة كبيرة من خطوط السجل وأحتاج إلى تحليل كل سطر (لذا فإن الكفاءة مهمة جدًا).

فقط كن على علم بأن لغة C++ لن تساعد كثيرًا من حيث الكفاءة في هذه الحالة.لا تنخدع بالاعتقاد أنه لمجرد أن لديك كود تحليل سريع في لغة C++، فإن برنامجك سيكون له أداء عالي!

الكفاءة التي تحتاجها حقًا هنا ليست الأداء على مستوى "رمز الجهاز" لرمز التحليل، ولكن على مستوى الخوارزمية العام.

فكر فيما تحاول القيام به.
لديك ملف نصي ضخم، وتريد تحويل كل سطر إلى بنية بيانات،

تخزين ضخم بنية البيانات في الذاكرة للغاية غير فعال, ، بغض النظر عن اللغة التي تستخدمها!

ما عليك القيام به هو "جلب" سطر واحد في كل مرة، وتحويله إلى بنية بيانات، والتعامل معه، وبعد الانتهاء من بنية البيانات فقط، يمكنك الذهاب وجلب السطر التالي وتحويله إلى بنية البيانات، والتعامل معها، وتكرارها.

إذا قمت بذلك، فقد قمت بالفعل بحل الاختناق الرئيسي.

لتحليل سطر النص، يبدو أن تنسيق بياناتك بسيط للغاية، راجع سؤالًا مشابهًا طرحته منذ فترة: تحليل سلسلة C++ (نمط بايثون)

في حالتك، أفترض أنه يمكنك استخدام دفق سلسلة، واستخدام >> عامل التشغيل لقراءة "الشيء" التالي في السطر.

يرى هذه الإجابة على سبيل المثال رمز.

بدلاً من ذلك ، (لم أكن أرغب في حذف هذا الجزء !!) إذا كنت تستطيع كتابة هذا في بيثون ، فسيكون ذلك أكثر بساطة.لا أعرف موقفك (يبدو أنك عالق مع C++)، ولكن لا يزال

انظر إلى هذا العرض التقديمي للقيام بهذه الأنواع من المهام بكفاءة باستخدام تعبيرات مولد بايثون: http://www.dabeaz.com/generators/Generators.pdf

انها تستحق القراءة.في الشريحة 31، يتعامل مع ما يبدو أنه شيء مشابه جدًا لما تحاول القيام به.

سوف يمنحك على الأقل بعض الإلهام.
كما يوضح أيضًا بقوة أن الأداء لا يتم اكتسابه من خلال كود تحليل السلسلة المعين، ولكن من خلال الخوارزمية الشاملة.

هل يمكن أن محاولة استخدام يكس بسيط / ياك |. فليكس / البيسون المفردات لتحليل هذا النوع من المدخلات

ومحلل تحتاج يبدو بسيطا حقا. نلقي نظرة على هذا. أي لغة مترجمة ينبغي أن يكون قادرا على تحليل ذلك في سرعة عالية جدا. ثم انها قضية ما بنية البيانات التي بناء وحفظ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top