Комплексное совпадение строк SPSS (v20) - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема, которую я не могу понять с помощью SPSS (v20).

Существует основной список с 10.000 строк. Думайте об этом как о массиве так: ['Sao Paolo S.P.', 'IDE MUNICH', '1_New YORK', 'BabylonX', ...]

У меня есть набор данных с переменной, которая содержит строки , аналогичные массиву, о котором говорилось выше, но они не совпадают.

Вот так:

enter image description here

Что мне нужно сделать: проверить, является ли OldString (из набора данных) частью какой-либо из строк в массиве master.

Очевидно, 123 Вавилон (из набора данных) будет связан с Вавилон * (из массива).

Очевидно, 1234 Sao Paolo S (из набора данных) будет связано с Sao Paolo S.P. (из массива).

и так далее ...

Если обнаружено совпадение, то строка из (основного) массива должна быть заполнена новой переменной NewString.

Есть ли способ достичь этого? Используя VBA, Perl, PHP, это очень просто, но используя SPSS, я не понял, как объединить эти шаги.

1 Ответ

0 голосов
/ 06 сентября 2018

Следующий синтаксис является возможным способом сделать цикл сравнения совпадений, используя char.index.

*First I'm turning your master list into a dataset - 
this can be done differently depending how the data is 
stored right now. In this example I just copy-pasted 
from your post into the syntax.

data list free/masterstring (a20).
begin data 
'Sao Paolo S.P.', 'IDE MUNICH', '1_New YORK', 'BabylonX'
end data.

*now I create a new syntax with a comparison command for each string in the list.

cd "c:\your path".
string cmd (a100).
compute cmd=concat("if char.index('",lower(rtrim(masterstring)),"', 
    lower(rtrim(mystring)))>0 matchedstr='",rtrim(masterstring),"'.").
write out="check strings.sps"/cmd.

* the syntax is ready, at this point you will go back to your original dataset. 
For the example I'm creating a small example dataset.

data list free/mystring (a20).
begin data 
"123 Babylon" "babylon" "Sao Paolo" "1234 Sao Paolo S" 
end data.

*now we can run the syntax created earlier on the present dataset.
string matchedstr (a50).
insert file="check strings.sps".
exe.

В результате вы должны увидеть, что «babylon» был распознан как часть «BabylonX» (команда выравнивает нижний / верхний регистры), и поэтому «BabylonX» появляется в matchedstring. То же самое для "Sao Paolo" и "Sao Paolo S.P.".

Примечание: если mystring соответствует более чем одной строке в списке, текущий синтаксис будет захватывать только последнее совпадение.

...