2012-09-19 40 views
0

我想解析从文件如何解析以下字符串

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

文本..

它们的顺序是不可预知的 即;

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

我是有名称的,B,C .... X类/结构,我需要的价值推到它们各自的值,我要保持它的简单,没有正则表达式以用于解析这个文本..

运行时间对我来说至关重要。我有具有>数据的300MB要解析的文件,

我带着令牌化字符串的strtok的想法( )..但在推tvalue之前,我必须比较什么类型的数据我推...这需要一些时间..

一些我要如何优化数据推到他们相关的类..甚至毫秒的事,在我可能挽救了几个运行时的珍贵秒结束的方式..

请你分享你的想法,我会很感激..

+2

数值数据类型是否一致并且只是转到特定的类?还是不同?你试过什么了? –

回答

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; 
    } 
} 
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; 
..... 

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

0

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

1

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

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