Как разобрать следующие строки

Я хотел бы разобрать

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

текст из файла ..

их порядок непредсказуем
то есть;

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

У меня есть классы / структура имени A, B, C …. X и мне нужно подтолкнуть значения к их соответствующим значениям, Я хочу, чтобы все было просто, регулярные выражения не используются для разбора этого текста.

RUNTIME имеет решающее значение для меня .. У меня есть файл, который содержит> 300 МБ данных для анализа,

Я пришел с идеей токенизации строки strtok () .. но прежде чем нажать tvalue, я должен сравнить, какой тип данных я нажимаю … это занимает некоторое время …

В некотором смысле я хочу оптимизировать способ передачи данных в соответствующие классы … даже миллисекунды имеют значение, в конце я мог бы сэкономить пару драгоценных секунд времени выполнения.

Пожалуйста, поделитесь своими мыслями по этому поводу, я буду благодарен ..

0

Решение

Ваше описание проблемы требует более подробной информации. Если токены можно выразить как регулярные выражения (я не говорю, что на самом деле используйте RE, а просто спрашиваю, возможно ли это), тогда самый быстрый способ их сканирования — это ручное кодирование дискретного конечного автомата. Если вы дадите РП, я покажу вам, как это сделать.

Как уже было сказано, использование файловой системы наилучшим образом так же важно, как и хороший алгоритм сканирования. Вы не дали свою ОС, поэтому мы не можем помочь вам с этим. Во многих ОС отображение памяти (например, в Linux, mmap) самый быстрый.

1

Другие решения

Что входит в «подталкивание [значения] к их соответствующим значениям»? Возможно, вы имели в виду соответствующий класс или некоторую переменную / функцию аккумулятора? Если бы вы могли привести пример обработки как минимум двух разных классов данных, это могло бы иметь большое значение для получения «наилучшего» ответа.

Сейчас я предполагаю, что данные представлены именно так, как показано в вашем вопросе. В зависимости от того, как вы указываете свои классы в текстовом файле, существуют более эффективные способы переключения () на значение, например использование целого числа, чтобы избежать использования функции 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 иметь самое быстрое совпадение типов. Предполагая, что вы уже прочитали тип 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

В таких простых случаях, как ваш, производительность ввода-вывода часто важнее производительности процессора. Так что вы должны убедиться, что вы, например, правильно настроили буферизацию.

0
По вопросам рекламы [email protected]