如何解析以下字符串

时间:2012-09-19 19:15:12

标签: c++ c lex

我想解析

CLASSA classAvalue;
CLASSB classBvalue;
... ....
CLASSX classXvalue;

文件中的文字..

他们的订单无法预测 即;

CLASSX classXvalue;
CLASSY classYvalue;
....   ......
CLASSA classAvalue;
CLASSB classBvalue;

我有名称A,B,C ......的类/结构,我需要将值推到各自的值,我想保持简单,不使用正则表达式解析此文本..

RUNTIME对我来说至关重要..我有一个文件,其中有300MB的数据需要解析,

我想到了对字符串strtok()进行标记的想法..但是在推送tvalue之前我必须比较我正在推送的数据类型......这需要一些时间..

我希望如何优化将数据推送到相关类的方式..即使毫秒也很重要,最后我可能会节省几秒钟的运行时间。

请分享你对此的看法,我会很感激..

4 个答案:

答案 0 :(得分:1)

您对问题的描述需要更多细节。如果令牌可以表示为作为正则表达式(我不是说实际使用RE,而只是询问它是否可行),那么扫描它们的最快方法就是手动编码离散有限自动机。如果你给RE,我会告诉你如何做到这一点。

如前所述,以最佳方式使用文件系统与良好的扫描算法同样重要。你没有给你的操作系统,所以我们无法帮助你。在许多操作系统中,内存映射(例如在Linux中,mmap)是最快的。

答案 1 :(得分:0)

“将值推送到各自的值”涉及什么?也许你的意思是各自的类或某种累加器变量/函数?如果你能提供一个至少两个不同类别的数据的例子,这些数据将大大有助于获得“最佳”答案。

现在,我将假设数据完全按照您的问题显示。根据您在文本文件中指定类的方式,有更好的方法来切换值,例如使用整数来避免使用下面的strcmp()。

//伪代码

while(not EOF)
  read a line from the file with fscanf or similar
  split sequence on first occurrence of a space
  switch() on the first segment which should be CLASS_
  call appropriate function to handle your data

//示例数据: myclassA 12345 myclassB 67890 myclassC 19348

int data
char class_str[MAX_CHARS];

ret = fscanf(fp,"%s %i",class_str,&data);
while(ret != EOF){
    switch(class_str){

        case(strcmp(class_Str,"myclassA")==0):
            myclassA_data_processing_function();
            break;

        case(strcmp(class_Str,"myclassB")==0):
            myclassB_data_processing_function();
            break;
    }
}

答案 2 :(得分:0)

如果单毫秒很重要 - 那么尝试实现Trie data structure以获得最快的类型匹配。假设您已将类型读取到char type[]并且您知道type长度:

switch (typeLength) {
case 3: // for cases where only one type aplies like e.g. Abc 
  if (0 == memcmp(type, "Abc", 3) { /*  read Abc object from stream */ }
  else ERROR;
  break;
case 5: // e.g. "Abcde", "Abcdf", "Ebcde"
  switch (type[0]) {
     case 'A': 
         // "A,,,"
         switch (type[1]) {
             case 'b':
...
                 switch (type[4]) {
                    case 'e': // read Abcde object
                    case 'f': // read Abcdf object
...     default: ERROR
     case 'E': // only Ebcde matches
         if (0 == memcmp(type + 1, "bcde") { /*  read Ebcde object from stream */ }
         else ERROR;
.....

这不是很容易实现 - 但我相信这是从字符串中确定对象类型的最快方法,只要你在解析之前知道类型。

答案 3 :(得分:0)

在像您这样的简单情况下,IO性能通常比CPU性能更重要。所以你应该确保你正确地获得缓冲,例如。