#performance #emeditor
#Производительность #emeditor
Вопрос:
В настоящее время у меня есть большие наборы данных с разделителями, и мне нужно вернуть минимальные и максимальные длины для каждого столбца. В настоящее время я использую следующий код в Emeditor v20.3, который отлично работает, но мне интересно, есть ли более быстрый способ, особенно когда есть миллионы строк данных и сотни столбцов (и этот код медленный).
Любые более быстрые подходы или идеи, которые можно было бы обернуть в макрос javascript, были бы высоко оценены.
for( col = colStart; col <= MaxCol; col ) {
sTitle = document.GetCell( 1, col, eeCellIncludeNone );
min = -1;
max = 0;
for( line = document.HeadingLines 1; line < MaxLines; line ) {
str = document.GetCell( line, col, eeCellIncludeQuotesAndDelimiter );
if( min == -1 || min > str.length ) {
min = str.length;
}
if( max < str.length ) {
max = str.length;
}
}
OutputBar.writeln( col min " " max " " sTitle);
}
Комментарии:
1. Для оптимизации скорости можно использовать команду » Найти самую длинную строку /ячейку » и команду » Найти непустую самую короткую строку/ячейку «.
2. Это здорово. Поскольку shortest возвращает непустое значение, есть ли оптимальный способ проверить, когда / если минимальная длина = 0 с помощью макроса?
3. Если наименьшая длина ячейки не равна нулю, то вы можете выполнить поиск пустой ячейки. Один из способов сделать это — выполнить поиск
^$
(regex) в выбранном столбце, пока'^' and '$' can Match Beginning and End of the Selection
задана опция.4. Спасибо за советы, Ютака, я думал о чем-то подобном, но я проведу некоторое тестирование. Если бы в будущей версии можно было добавить метод, который просто возвращал бы наименьшее значение (включая ноль), это было бы здорово.
var noZeroLengthData = document.Filter("",xOrgCell,eeFindWholeString,0,0,0);
5. Следующая версия (20.3.906) будет включать в себя команду » Найти кратчайшую строку / ячейку «.
Ответ №1:
Пожалуйста, обновите EmEditor до версии 20.3.906 или более поздней и запустите этот макрос:
colStart = 1;
MaxCol = document.GetColumns();
document.selection.EndOfDocument();
yLastLine = document.selection.GetActivePointY( eePosCellLogical );
min = -1;
max = 0;
for( col = colStart; col <= MaxCol; col ) {
sTitle = document.GetCell( 1, col, eeCellIncludeNone );
document.selection.SetActivePoint( eePosCellLogical, col, 1 );
editor.ExecuteCommandByID( 4064 ); // Find Empty or Shortest Cell
y = document.selection.GetActivePointY( eePosCellLogical );
if( y < yLastLine ) { // check if not the last empty line
str = document.GetCell( y, col, eeCellIncludeQuotes );
min = str.length;
}
else { // if the last empty line
document.selection.SetActivePoint( eePosCellLogical, col, 1 );
editor.ExecuteCommandByID( 4050 ); // Find Non-empty Shortest Cell
y = document.selection.GetActivePointY( eePosCellLogical );
str = document.GetCell( y, col, eeCellIncludeQuotes );
min = str.length;
}
document.selection.SetActivePoint( eePosCellLogical, col, 1 );
editor.ExecuteCommandByID( 4049 ); // Find Longest Cell
y = document.selection.GetActivePointY( eePosCellLogical );
str = document.GetCell( y, col, eeCellIncludeQuotes );
max = str.length;
OutputBar.writeln( col " : " min " " max " " sTitle);
}
Комментарии:
1. Отлично — работает, как и ожидалось, и намного быстрее (надеюсь, в будущих версиях он сможет работать еще быстрее). Спасибо тебе, Ютака!