AdryV |
Отправлено: 10 Мая, 2019 - 00:51:44
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
может в коде и есть ошибки но этот код обрабатывает 50000 строк без ошибок а когда сталкивается с теми строками выдает ошибку
CODE:int pos_size_button0[2][4];
string text_button0[2];
int flag_button0[2];
pos_size_button0[0][0]=20; pos_size_button0[0][1]=50; pos_size_button0[0][2]=100; pos_size_button0[0][3]=20;
pos_size_button0[1][0]=20; pos_size_button0[1][1]=80; pos_size_button0[1][2]=100; pos_size_button0[1][3]=20;
text_button0[0]="items"; text_button0[1]="mobs";
//////////
int pos_size_combo0[1][4];
string text_combo0[1][7];
int strok_combo0[1];
int flag_combo0[1];
pos_size_combo0[0][0]=20; pos_size_combo0[0][1]=10; pos_size_combo0[0][2]=100; pos_size_combo0[0][3]=80;
strok_combo0[0]=7;
text_combo0[0][0]="R2PN"; text_combo0[0][1]="R2HAZY"; text_combo0[0][2]="R2HELNET";
text_combo0[0][3]="R2GAME"; text_combo0[0][4]="R2ARENA"; text_combo0[0][5]="R2WORLD";
text_combo0[0][6]="R2RUOFF";
flag_combo0[0]=0;
//////////
int pos_size_static0[1][4];
string text_static0[1];
pos_size_static0[0][0]=20; pos_size_static0[0][1]=35; pos_size_static0[0][2]=80; pos_size_static0[0][3]=15;
text_static0[0]="Текст 0";
//////////
createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
////////
int col, x, y;
getdisplay(col, x, y);
showdialog(0, "Диалог", x/2-84, y/2-85, 148, 134, 3, 1);
//////////
external(INT, "regex_search", "regex_search", pathfolder()+"\regex.dll");
//
char result[100][100];
string k="\"+formatic(34);
string r;
string id;
string name;
string name_konvert;
int save_flag_combo0=-1;
int count_string;
int i=0;
string s[100000];
int size_array=99999;
//////////////////////////////
loop()
{
if(flag_button0[0]>0) //items
{
flag_button0[0]=0;
patern("2");
name_konvert="/items_";
konvert();
}
//
if(flag_button0[1]>0) //mobs
{
flag_button0[1]=0;
patern("6");
name_konvert="/mobs_";
konvert();
}
sleep(50);
}
////////////////
function patern(string j)
{
string f="5";
if(flag_combo0[0]>1)f="2";
r=k+f+k+"\s*"+k+j+k+"\s*"+k+"(\d+)"+k+"\s*"+k+k+"\s*"+k+"(.*)"+k;
//if(flag_combo0[0]==1)size_array=60000;
//else size_array=40000;
}
///////////////
function konvert()
{
string obr=pathfolder()+"LangPack/"+text_combo0[0][flag_combo0[0]];
string pyt_file_origin=obr+"/LangPack.tsv";
string pyt_file_save=obr+name_konvert+text_combo0[0][flag_combo0[0]]+".ini";
int prov_konca=-1;
int hg=0;
if(save_flag_combo0!=flag_combo0[0]) {
save_flag_combo0=flag_combo0[0];
if(fopen(pyt_file_origin, "r")!=0) // если файл открылся
{
for(i=0; freadline(s[i])>0 && i<size_array; i++)text_static0[0]="Стр: "+format(i);
fclose();
}
else
{
text_static0[0]="Нет файла";
return 0;
}
count_string=i; // количество строк в файле
}
//
if(fopen(pyt_file_save, "w")>0) // если файл для записи открылся
{
for(i=0; i<count_string; i++) // для всех строк
{
text_static0[0]="Ищет: "+format(i);
int x=regex_search(s[i], r, address(#result[0][0]), sizearray(result), sizearray(result[]));
if(x>1)
{
prov_konca=0;
text_static0[0]="Запис: "+format(i);
id=format(#result[0][0]);
name=format(#result[1][0]);
fwrite("["+id+"]"+formatic(13)+formatic(10)+name+"=");
fwrite(ENDL);
fwrite("["+name+"]"+formatic(13)+formatic(10)+id+"=");
fwrite(ENDL);
}
/*
else
{
if(prov_konca==0) {
hg++;
if(hg>100)break;
else {prov_konca=-1;hg=0;}
}
}
*/
}
fclose();
text_static0[0]="Завершено";
}
}
файл который обрабатывается состоит из более 130000 строк
вот сам файл
и вот строки на которых ошибка
CODE:"2" "10" "951" "" "Снижение получаемого урона в ближнем бою.
"
"2" "10" "952" "" "Снижение получаемого урона от дистанционных атак.
"
"2" "10" "953" "" "Снижение получаемого урона от дистанционных атак.
"
ПС.... на патерн поиска всеравно даже если будет ".*" все равно будет ошибка
------------------------------------------------------------
убрал ошибку в патерне.... но эт все равно(Отредактировано автором: 10 Мая, 2019 - 01:01:49) |
|
|
Zireael |
Отправлено: 10 Мая, 2019 - 01:36:47
|
Эксперт
Покинул форум
Сообщений всего: 4469
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: получается перед вызовом функции regex_search мне нужно всю строку преобразовать в чар и потом первые 3 чара проверить?
Нет конечно.
CODE:if(s[i]!=formatic(34)) |
|
|
Zireael |
Отправлено: 10 Мая, 2019 - 11:41:48
|
Эксперт
Покинул форум
Сообщений всего: 4469
Дата рег-ции: Нояб. 2017
Репутация: 585
|
AdryV, сколько времени скрипт выполняется? Если нужно сделать быстро, то можно читать файл в массив char и использовать функцию regex_iterator, она сразу найдёт все совпадения.
Для примера:
Цитата: // найти все строки такого вида:
// "2" "10" "9" "" "Заклинание, поражающее врага горящей стрелой."
// в файл запишет: 9 Заклинание, поражающее врага горящей стрелой.
code (Отобразить)CODE:#define GENERIC_READ -2147483648
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_NORMAL 128
external(INT, "CreateFile", "CreateFileA", "Kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll");
external(INT, "ReadFile", "ReadFile", "Kernel32.dll");
external(INT, "regex_iterator", "regex_iterator", pathfolder()+"\regex.dll");
string path_in="C:\LangPack.tsv"; // путь к файлу
string path_out="C:\LangPack2.tsv"; // куда сохранить
char c[9999999];
int count_byte;
string k="\"+formatic(34);
string j="10";
string f="2";
string r=k+f+k+"\s*"+k+j+k+"\s*"+k+"(\d+)"+k+"\s*"+k+k+"\s*"+k+"(.*?)"+"(?:"+k+"|\r\n"+k+")";
// найти все строки такого вида:
// "2" "10" "9" "" "Заклинание, поражающее врага горящей стрелой."
// в файл запишет 9 Заклинание, поражающее врага горящей стрелой.
char result[9999][999];
int hFile=CreateFile(path_in, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // открыть файл
if(hFile>0) // если открылся
{
if(ReadFile(hFile, address(#c[0]), sizearray(c), address(#count_byte), 0)) // прочитать файл
{
CloseHandle(hFile);
messagebox("Прочитано байт: "+format(count_byte));
if(fopen(path_out, "w"))
{
int x=regex_iterator(format(#c[0], count_byte), r, address(#result[0][0]), sizearray(result), sizearray(result[]));
messagebox("Найдено совпадений: "+format(x/2)); // делим на 2, т. к. ищутся 2 подгруппы
if(x>1)
{
for(int i=0; i<x; i=i+2) // пишем в файл
{
fwrite(format(#result[i][0])+" "+format(#result[i+1][0])); fwrite(ENDL);
}
}
fclose();
}
}
else messagebox("Файл для записи не открылся");
}
else messagebox("Файл для чтения не открылся"); |
|
|
|