Страница 1 из 1

Replace

Добавлено: 25 май 2019, 08:28
Fodin
Посмотрел, что в инструкции к спектракалку Вы жалуетесь, что он медленно работает с пробелами. Заглянул в функцию.

Вот это вот все:

Код: Выделить всё

function input_replace(){
spct_Ugly = spct;
spct = replace_string(spct,'       ','\t');
spct = replace_string(spct,'      ','\t');
spct = replace_string(spct,'     ','\t');
spct = replace_string(spct,'    ','\t');
spct = replace_string(spct,'   ','\t');
spct = replace_string(spct,'  ','\t');
spct = replace_string(spct,' \t','\t');
spct = replace_string(spct,' \n','\n'); //argyll
spct = replace_string(spct,'\t ','\t');
spct = replace_string(spct,'\t\t\t\t\t\t\t','\t');
spct = replace_string(spct,'\t\t\t\t\t\t','\t');
spct = replace_string(spct,'\t\t\t\t\t','\t');
spct = replace_string(spct,'\t\t\t\t','\t');
spct = replace_string(spct,'\t\t\t','\t');
spct = replace_string(spct,'\t\t','\t');
spct = replace_string(spct,'\n\n','\n');
spct = replace_string(spct,'\t\n','\n');
spct = replace_string(spct,'\n\t','\n');
spct = replace_string(spct,',','.');
spct = replace_string(spct,'"',''); //PO
spct = replace_string(spct,'\t\r','\r'); //Opera, IE
spct = replace_string(spct,'\r\t','\r'); //Opera, IE
spct = replace_string(spct,'\r\r','\r'); //Opera, IE
spctOK = spct;
}
должно выглядеть так:

Код: Выделить всё

function input_replace(){
spct_Ugly = spct;
spctOK = spct.replace(//[\t ]+/g/g, '\t').replace(/\s+/g, '\n').replace(/,/g, '.').replace(/\"/g, '');
}
Оу, я не сразу заметил, что Вы сами написали replace_string... Циклом... С конкатенациями множественными...

Посмотрите https://learn.javascript.ru/regular-exp ... javascript - обязательно пригодится. Остальные replace_string() тоже можно заменить на стандартную функцию. Работает везде и давно.

Re: Replace

Добавлено: 27 май 2019, 18:58
mihas
Спасибо! Да этот момент давно ждет улучшения!

Re: Replace

Добавлено: 27 май 2019, 22:22
Fodin
Ох. И опечатка, и фактическая ошибка в алгоритме замены вышла. Слишком долго смотрел на функцию. :)
spct.replace(/\s*[\n\r]+\s*/g, '\n').replace(/[\t ]+/g, '\t').replace(/,/g, '.').replace(/\"/g, '')
Первая замена меняет строки из пробельных символов (табы, пробелы, \r, \n), в которых содержится хотя бы один \n или \r, на \n.
Вторая меняет строки из пробелов и табуляций на табуляцию.
Не знаю, зачем замена на \r последними строками. По мне так логично привести файл к ситуации, когда в нем только табы и \n.

Re: Replace

Добавлено: 27 май 2019, 22:26
mihas
Спасибо! Протестирую!

Re: Replace

Добавлено: 28 май 2019, 02:09
Fodin
Я потестировал на файле с данными спектрального промера 4000 плашек i1Profiler'ом. 1771262 байт должны превратиться в 1135892.
Старая функция: 717172 мс = 12 минут.
Новая функция: 135 мс. В 5300 раз быстрее.
А если сначала сделать основные замены (табы и пробелы), а потом второстепенные, то получится 117 мс. В 6100 раз быстрее. Ух!

Re: Replace

Добавлено: 28 май 2019, 02:33
mihas
Спасибо дорогой друг! Зачетно!
Да эту тупую функцию замен по циклам давно надо было переписать видимо, у меня идей как-то не было. А то что тормоза - видел конечно.