Sunday, January 13, 2013

Եզակի անձնանունների մասին

Նախագահական ընտրությունների հետ կապված ՀՀ ոստիկանության կայքում տեղադրվել են Հայաստանի բոլոր ընտրատեղամասերի ընտրողների ցուցակները` ըստ ընտրատարածքների։ Ես աչքի էի անցկացնում իմ ընտրատեղամասի ցուցակները և հանդիպեցի բավականին շատ հազվադեպ հանդիպող անձնանունների։ Միանգամից ցանկություն առաջացավ տեսնել, թե է՛լ ինչպիսի եզակի անուններ կան, օրինակ այն ընտրատարածքում, որում ես գրանցված եմ։ Այս գրառման մեջ կներկայացնեմ, թե ինչպես «լուծեցի» այդ խնդիրը։

Նշված էջում ամեն մի ընտրատարածքի համար նախատեսված է համարակալված պանակ, որի մեջ առանձին Microsoft Excel ֆայլերով տրված են ընտրատեղամասերի ընտրողների ցուցակները։ (Օրինակ, ես գրանցված եմ 39-րդ ընտրատարածքի 18-րդ ընտրատեղամասում։ Հետևաբար իմ տվյալները պետք է որոնեմ 39 համարով պանակի 39_18.xls ֆայլում։) Նախ, իմ աշխատանքային պանակում ստեղծեցի uniquenames անունով մի պանակ և այն դարձրեցի ընթացիկ։
mkdir uniquenames
cd uniquenames
Այնուհետև wget ծրագրով համակարգիչ բեռնեցի 39-րդ պանակի բոլոր ֆայլերը․
wget -r -np -A '*.xls' http://www.police.am/yntrutyunner/39/
Այս հրամանի կատարումից հետո uniquenames պանակում ստեղվեց բեռնված պանակների հիերարխիա՝ www.police.am/yntrutyunner/39/ ճանապարհով։ Հարմարության համար բոլոր xls ֆայլերը պատճենեցի ընթացիկ պանակի մեջ․
cp www.police.am/yntrutyunner/39/*.xls .
Excel ֆայլերի հետ աշխատելու ոչ մի ցանկություն չունեմ, հետևաբար դրանք պետք է փոխարինել մի որևէ պարզ ֆորմատի։ Ես ընտրեցի ստորակետով բաժանված դաշտերով (csv) ֆորմատը։ Իսկ քանի որ ֆայլերում ինֆորմացիան գրված է ArmSCII-8 կոդավորմամբ, նաև պետք է ձևափոխություն կատարել Utf-8 կոդավորման։ Իմ Ubuntu 12.04 համակարգում տեղադրված է LibreOffice 3.5 փաթեթը, որի Calc ծրագիրը կարողանում է բացել Microsoft Excel ֆայլերը։ Բայց քանի որ ֆայլերը շատ են, ձևափոխությունը ավելի հարմար է անել հրամանային տողից։ Պանակի բոլոր Excel ֆայլը csv ֆայլերի փոխարինելու համար պետք է գրել հետևյալ հրամանը․
libreoffice --nologo --calc --convert-to csv *.xls
Ստեղծվում են *.csv ընդլայնումով ֆայլեր, որոնց պարունակությունը ArmSCII-8 կոդավորմամբ է։ Դրանք Utf-8 կոդավորման ձևափոխելու համար կարելի է օգտագործել iconv ծրագիրը: Հետևյալ հրամանը գտնում է պանակի բոլոր csv ֆայլերը և ամեն մեկի համար ստեղծում է նրա Utf-8 կոդավորմամբ տարբերակը՝ *.txt ընդլայնմամբ։
find . -name '*.csv' -exec iconv -f ArmSCII-8 -t Utf-8 {} -o {}.txt \;
Այս դրությամբ արդեն ունեմ Utf-8 կոդավորմամբ տեքստային ֆայլեր, որոնց ամեն մի տողում գրված է մի ընտրողի մասին ինֆորմացիա։ Ֆայլերի սկզբում մնացել է Excel աղյուսակի սյունակի վերնագրերը, բայց քանի որ ընտրողների տվյալները համարակալված են, մշակելիս ես կդիտարկեմ միայն թվանշանով սկսվող տողերը։

Այս տիպի խնդիրների լուծման համար ամենահարմար գործիքը AWK ծրագրավորման լեզուն է: Իմ համակարգում տեղադրված է այդ լեզվի gawk (GNU Awk) իրականացումը։ Ահա մի կարճ սկրիպտ, որը բոլոր ֆայլերից հարդում է մարդկանց անունները, հաշվում է ամեն մի անունի հանդիպելու քանակը և արտածում է այն անունները, որոնք հանդիպել են միայն մեկ անգամ։
BEGIN { FS = "," }

/^[0-9]/ { names[$3]++ }

END {
  uniques = ""
  for(e in names)
    if( names[e] == 1 )
      uniques = uniques e " "
  print uniques
}
Հրամանային տողից այս ծրագիրն աշխատեցնելու համար (այն պահպանել եմ uniquenames.awk անունով ֆայլում) պետք է գրել․
gawk -f uniquenames.awk *.txt
Որն անունները տերմինալին կարտածի բացատանիշերով անջատված ու չկարգավորված տեսքով։ Մեկ այլ հրամանով կարելի է անունները կարգավորել ու արտածել մեկ սյունակով (կամ ուղարկել sorted-names.txt ֆայլի մեջ)։
gawk -f uniquenames.awk *.txt | tr " " "\n" | sort > sorted-names.txt
Եվ վերջում հեռացնեմ բոլոր ժամանակավոր ֆայլերը․
rm *.xls *.csv *.csv.txt

* * *
Անպայման առաջարկում եմ լսել Հովհաննես Շիրազի «Հայոց անունները» պոեմը։

No comments:

Post a Comment