Оптимизированный макрос EmEditor для возврата минимальной / максимальной длины столбца для данных с большими разделителями

#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. Отлично — работает, как и ожидалось, и намного быстрее (надеюсь, в будущих версиях он сможет работать еще быстрее). Спасибо тебе, Ютака!