Я пишу программу, которая:
- выполняет итерации в диапазоне
- сравнивает каждую текущую ячейку со строкой (строка является правильно написанным словом. Thisпредполагает, что каждое новое слово написано правильно)
- обновляет текущую ячейку, чтобы соответствовать строке, если она похожа (> = установленный процент)
важное примечание: Это предназначено для итерации по диапазону в одном столбце, и в настоящее время у меня нет необходимости повторять по нескольким столбцам.
Программа в настоящее время находится в рабочем состоянии, но у нее много проблем с длинными строками, иЯ не могу понять, почему.Я хотел посмотреть, может ли кто-нибудь указать мне правильное направление.
Цель этой программы:
В настоящее время я застрял, работая с грязными данными из импорта OCR, которыйбыло нежелательно.
многие мои повторяющиеся значения написаны с ошибками (и не для проверки правописания)
например:
- тестирование
- t3st1ng
- t3-й 1 г
- tes5fng
- te5f1n @
- бананы
- 3abanas
- benAnes
- 8n4anans
исправляется как:
- проверка
- проверка
- тестирование
- тестирование
- тестирование
- бананы
- бананы
- бананы
- бананы
Я делаю все эти значения равными первому значению.Когда он попадает в бананы, он использует бананы в качестве нового первого значения.Я надеюсь, что это имеет смысл.
Программа отлично работает, используя этот первый пример
НО
Проблема в том, что у меня есть строки, подобные этой:
- это тест системы аварийного вещания
- это тест аварийного вещания r @ io system
- th1s это тест Emerg3ncyсистема радиовещания
- система радиовещания в чрезвычайных ситуациях сейчас тестирует
- система радиосвязи аварийного вещания br0adcast в настоящее время
- система вещания в чрезвычайных ситуациях [st adio sysfm сейчас тестирует
- пожалуйста, не пугайтесь, так как это всего лишь тест
- , пожалуйста, не пугайтесь, так как это всего лишь 2 теста
- пожалуйста, не будьте @ larm3d, как этотолько лучший
- и теперь вернемся к вашему регулярному программированию
- и теперь 8ack к вашей регулярной программе ming
- и теперь 8ack к вашему регулярному программированию re @ flarly
исправленоs:
- это тест системы радиовещания в чрезвычайных ситуациях
- это тест системы радиовещания в чрезвычайных ситуациях
- это тестсистемы радиовещания в чрезвычайных ситуациях
- это испытание системы радиовещания в чрезвычайных ситуациях
- это испытание системы радиовещания в чрезвычайных ситуациях
- это испытание системы радиосвязи в чрезвычайных ситуацияхсистема радиовещания в чрезвычайных ситуациях
- это тест системы радиовещания в чрезвычайных ситуациях
- это проверка системы радиовещания в чрезвычайных ситуациях
- это проверка системы радиовещания в чрезвычайных ситуацияхрадиосистема
- это тест системы радиовещания в чрезвычайных ситуациях
- это тест радиосистемы аварийного вещания
- это тест системы радиовещания в чрезвычайных ситуациях
Вот моя программа.
function repairDuplicates() {
try {
// necessities
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var as = ss.getActiveSheet();
var sr = as.getDataRange(); // entire sheet range
var ar = as.getActiveRange(); // active range
var srv = sr.getValues(); // values of entire sheet
var arv = ar.getValues(); // values of active range
function minify(x){ // take a string. trim, remove all white space, convert to array, capitalize, remove special characters
var txt = x.trim();
txt = txt.replace(/ /g, '');
var arr = txt.split('');
arr = arr.map(function(a){return a.toUpperCase()});
var std = arr.sort();
var reg = new RegExp(/\W{1}/);
for (var z = 0; z < std.length; z++){
if (reg.exec(std[z]) != null){
std.splice(z,1);
}
}
return std;
}
function compareLength(x,y){ //take two arrays and compare length. if the length is different, then make it the same length by adding "x" n number of times. this will modify the arrays
var xl = x.length;
var yl = y.length;
if (xl < yl){
for (xl; xl < yl; xl++){
x.push("x");
}
}
else if (yl < xl){
for (yl; yl < xl; yl++){
y.push("x");
}
}
}
function compareData(x,y){ //take two arrays and compare data. if the arrays match, return "match". else if the arrays are more than (50)% similar, return "pass". else, return "fail"
var z = [];
var result;
if (x.toString() == y.toString()){
result = "match";
}
else if (x.toString() != y.toString()){
var z = y.filter(function (word) {
return x.indexOf(word) != -1;
});
//ui.alert(x);
//ui.alert(x.length);
//ui.alert(z);
//ui.alert(z.length);
var score = z.length/x.length;
if(score > 0.5){
result = "pass";
}
else{
result = "fail";
}
}
return result;
}
// function checkFirst(r, c, x, y){ // deprecated. no need to verify first cell
// if(r == 0 && c == 0){
// x = y;
// }
// return x;
// }
function iterate(range, values, text){ // takes a data range, the values of the range, and a string.
// iterates over range data (row by row, and cell by cell in each row).
// each current cell is checked and compared against the string.
// if the current cell passes the similarity check (compareData), then make the current cell equal to the previous cell
// if the current cell fails the similarity check, then do not change the value of the cell, but make the string(text) equal to the current cell
for (var r = 0; r < values.length; r++) {
var row = values[r];
for (var c = 0; c < row.length; c++) {
var cell = row[c];
//ui.alert("using: " + text);
//ui.alert(cell);
var arr = minify(cell);
var minTxt = minify(text);
compareLength(minTxt, arr);
var t = compareData(minTxt, arr);
//ui.alert(cell + ": " + t)
if (t == "pass"){
values[r][c] = text;
}
else if (t == "fail"){
ui.alert("\"" + text + "\"" + "\n \n" +"does not match" + "\n \n" + "\"" + cell + "\"" + " on row number " + (r + 2) + "..." + "\n \n" + "\"" + cell + "\"" + " is the new comparison string");
text = cell;
}
}
}
range.setValues(values);
}
// main loop
var txt = ar.getValue();
//ui.alert(txt);
iterate(ar, arv, txt);
}
catch (err) {
ui.alert(err);
}
}
, а вот ссылка на лист, который я тестирую на .
Вещи, которые я пробовал:
- корректировка процентной доли подобия.настройка его на 70-90% дает лучшие результаты ... но все же не совсем точные.
- отключение сравнения Длины.получил точно такой же удивительный результат
Теории:
- это определенно сработало бы лучше, если бы я мог использовать «include» вместо «indexOf», но, насколько мне известно, скрипт приложений Google не поддерживает ES6
Спасибо за любыепомощь!