簡體   English   中英

解析 C++ 中的字符串

[英]Parsing a string in C++

我有大量的日志行,我需要解析每一行(所以效率非常重要)。

每個日志行的格式為

cust_name time_start time_end (IP 或 URL )*

所以 ip 地址、時間、時間和一個可能為空的 ip 地址或 URL 列表,用分號分隔。 如果最后一個列表中只有 ip 或 url 則沒有分隔符。 如果超過 1 個,則用分號分隔。

我需要一種方法來解析這一行並將其讀入數據結構。 time_start 或 time_end 可以是系統時間或 GMT。 cust_name 也可以有多個由空格分隔的字符串。

我可以通過逐個字符讀取並編寫自己的解析器來做到這一點。 有一個更好的方法嗎?

在這類事情上,我已經使用Boost Tokenizer取得了成功。 它可以幫助您將輸入 stream 分解為標記之間具有自定義分隔符的標記。

使用正則表達式( boost::regex是 C++ 的一個很好的實現),您可以輕松地分隔字符串的不同部分 - cust_name, time_start...並找到所有這些 urls\ips

如果需要,第二步是對該組進行更詳細的解析。 例如,您可以使用boost::datetime庫解析日期(如果字符串格式不標准,則編寫自定義解析器)。

為什么要在 C++ 中這樣做? 對於 perl 之類的東西來說,這聽起來像是一項顯而易見的工作。

考慮使用正則表達式庫...

自定義輸入需要自定義解析器。 或者,祈禱有一個理想的世界,不存在錯誤。 特別是,如果您想提高效率。 發布一些代碼可能會有所幫助。

對於這樣一個簡單的語法,您可以使用拆分,看看http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

UPDATE徹底改變了答案!

我有大量的日志行,我需要解析每一行(所以效率非常重要)。

請注意,在這種情況下,C++ 在效率方面不會有太大幫助。 不要誤以為僅僅因為你在 C++ 中有一個快速解析代碼,你的程序就會有高性能!

你在這里真正需要的效率不是解析代碼的“機器碼”級別的性能,而是整體算法級別的性能。

想想你想做什么。
你有一個巨大的文本文件,你想把每一行轉換成一個數據結構,

在 memory 中存儲巨大的數據結構是非常低效的,無論您使用什么語言!

您需要做的是一次“獲取”一行,將其轉換為數據結構並處理它,然后,只有在您完成數據結構之后,您 go 並獲取下一行並轉換它到一個數據結構,處理它,然后重復。

如果你這樣做,你已經解決了主要瓶頸。

對於解析文本行,您的數據格式似乎非常簡單,請查看我剛才提出的類似問題: C++ string parsing (python style)

在您的情況下,我想您可以使用字符串 stream,並使用>>運算符來讀取該行中的下一個“事物”。

請參閱此答案以獲取示例代碼。

或者,(我不想刪除這部分。,)如果你可以在 python 中編寫它,它會簡單得多。 我不知道你的情況(看來你被 C++ 困住了),但仍然

查看此演示文稿,了解如何使用 python 生成器表達式有效地完成這些任務: http://www.dabeaz.com/generators/Generators.pdf

值得一讀。 在幻燈片 31 中,他處理的內容似乎與您正在嘗試做的事情非常相似。

它至少會給你一些靈感。
它還非常強烈地表明,性能不是通過特定的字符串解析代碼獲得的,而是通過整體算法獲得的。

您可以嘗試使用簡單的 lex/yacc|flex/bison 詞匯來解析這種輸入。

您需要的解析器聽起來很簡單。 看看這個。 任何編譯語言都應該能夠以非常高的速度解析它。 然后是您構建和保存的數據結構的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM