Daha çox

Atribut cədvəlindəki bütün sahələri təkrarlayın və sahəyə görə vurun


Məndə bir siyahıyaalma dəyişənlərinin (irqi, yaşı, təhsili və s.) Bir dəsti var. Bu sahələrin hamısını hesabladığım bir əmsalla çoxaltmaq istəyirəm. Misal üçün:

Sahə 1, 10,20,30,40 dəyərlərinə malikdir

Sahə 2, 120,340,230,210 dəyərlərinə malikdir

Sahə 3 500,3402,0342,9402 dəyərlərinə malikdir

Çarpan sahənin 0,1, 0,2, 0,3, 0,4 dəyərləri vardır

Bütün sütunlardan 'təkrarlamaq' və onları vurma sahəmlə çoxaltmaq istəyirəm. Ənənəvi olaraq, sahə kalkulyatorundan istifadə edərdim! Field1! *! Çarpan !, amma bunu 200+ sahə üçün etmək məcburiyyətində qalmamağa çalışıram.

Hər hansı bir təklif?

ArcMap 10.2.2 istifadə edirəm.


Düzgün başa düşsəm, hər sətrin "Çarpan" sahəsindəki bir dəyəri var, bunun sayəsində digər sahələrin hamısında dəyərləri çoxaltmaq istərdiniz.

Sahə kalkulyatoru hər dəfə yalnız bir sahə işləyir, halbuki toplu iş rejimində çalışdıra bilərsiniz. 200-dən çox sahə üçün bir axtarış imlecindən istifadə edən aşağıdakı kimi bir kod tövsiyə edirəm. Python konsoluna qoyun.

layer = 'layername' # TOC multfield-dən sürükləmə = "multiplikator field name" fieldnames = [i.name for i for arcpy.ListFields (layer) if if i.qu Required] ind = fieldnames.index (multfield) # now where you know siyahıda kursor kimi arcpy.da.UpdateCursor (qat, sahə adları) ilə: kursordakı sıra üçün: aralığdakı n üçün (len (sahə adları)): əgər n == ind: davam # sürət alanını yeniləməyin sıra [n] = sıra [n] * sıra [ind] cursor.updateRow (sıra)

Bu çoxalmaq istədiyinizi düşünür hər çarpanın özü və "OBJECTID" kimi avtomatik sahələr xaricində çarpma ilə sahə. Mətn sahələriniz varsa, bir səhv əldə edəcəksiniz.


Hər sətirdə bir sütunu yeniləmək üçün cədvəldə təkrar etməyin ən yaxşı yolu nədir?

3.2 milyard satırdan ibarət bir cədvəlim var. Bit məlumat növü ilə [Gün işığı] adlı bir sütuna əlavə etmək lazım gəldi. İlin hər günü üçün hər stansiyanı təkrarlamaq üçün bir şərh yazdım. Bu o qədər dəlicəsinə uzun çəkir ki, indi yolda bir şey öyrənməyin (inşallah) əlavə faydası ilə yanaşı başqa variantları da araşdırıram. İlin hər günü üçün gündoğumu və qürub dəyərlərini tutacaq ikinci bir cədvəl yaratmaq fikri oynadım, amma bu da böyük bir masa olacaq (30.000-dən çox stansiya, 1-50 + il aralığında məlumatların toplanması).

Bu vəzifəni yerinə yetirmək üçün daha yaxşı bir yol varmı? SQL istifadə etməyimdən bəri 10 ildən çox vaxt keçdiyindən həqiqətən düzgün istiqamətə yönəlmiş bir barmağı axtarıram. Yaxın gələcəkdə, günün / gecənin vacib olacağı məlumatların müxtəlif ortalamalarını saxlamaq üçün yaradılmış əlavə cədvəllər olacaqdır. Riyaziyyatı bildiyim halda olmalıdır ön tərəfdən və ya sorğu zamanı ediləcək, bunlar dəyişməyəcək bütün statik məlumatlardır, buna görə dəfələrlə hesablamaqdansa, onları saxlamaq yaxşı olardı.

Aşağıda sütunu yeniləmək üçün çalışdığım skript (cədvəlin indi kilidləndiyinə görə işləsə də, işləsə).

Hər hansı bir kömək və ya təklifiniz üçün əvvəlcədən təşəkkür edirik!

Tələb olunan məlumatlar üçün düzəliş edildi. Təşəkkür edirəm @JoeObbish.

Yalnız tam açıqlanması üçün və başqalarının etdiyim səhvləri etmək üçün kifayət qədər ağılsız olması halında .. İlk skriptimdə saxlanılan prosedurları UDF-lərə dəyişdim, sonra bu ikisini çağıran və müxtəlif şərti ifadələri yerinə yetirən başqa bir UDF yazdım. Axtarırdım. Beləliklə, yuxarıdakı həddindən artıq açıq ssenari əvəzinə, aşağıdakılara bənzər bir şey işlədirəm.

Bu, heç bir düymə və indeks olmadan 10 milyon satırdan ibarət olan və hər satırdakı sahəni 34 dəqiqə 59 saniyədə uğurla (və dəqiq) yeniləyə bilən bir test masasında çalışdı. 300 k cərgə üçün təxminən 8 saatdan daha yaxşı performans.

Yenə də məsləhət və rəhbərlik üçün təşəkkür edirəm. Bu, həqiqətən yüksək qiymətləndirilir.


Yeniləmə sahələri makrosu haqqında nə bilməlisiniz

Aşağıdakı makro, sahələrin harada olmasından asılı olmayaraq, aktiv Word sənədindəki bütün sahələri yeniləyəcəkdir. Sahələri yeniləmək üçün bir makro istifadə edərək, bütün sahələrin yenilənməsi üçün makronu çalıştırmanız lazımdır. Alternativ olaraq, əsas hekayə, başlıqlar, altbilgilər, dipnotlar, son qeydlər, mətn qutuları və digər formalar kimi Word'ün müxtəlif hissələrində yayıldıqda bütün sahələrin yeniləndiyindən əmin olmaq üçün bir sıra əl işləri yerinə yetirməli ola bilərsiniz.

Qeyd edək ki, makroda baş verənlər barədə bir az izah edən bir sıra şərhlər var. Aşağıdakı makro koddan sonrakı məlumatlar daha ətraflı əhatə edəcəkdir.

Aşağıdakı makro kodu kopyalayıb Normal.dotm dosyanıza və ya seçdiyiniz başqa bir Word sənədinə daxil edə bilərsiniz. Makronun quraşdırılması ilə bağlı kömək üçün baxın Makronun qurulması.

Worddəki sahələri əl ilə yeniləmisinizsə göstərilə biləcək xəbərdarlıqlar, Updates Fields makrosundan istifadə edilərkən avtomatik olaraq yatırılır

Alanları əl ilə yeniləməyə çalışırsınızsa şərhlər, dipnotlarson qeydlər, Word, aşağıda göstərilən Şəkil 1-də göstərildiyi kimi bir xəbərdarlıq göstərərək hərəkətin geri alınamayacağını söyləyə bilər. Yeniləmə sahələri makrosunun sənəddəki istənilən sahəni bu cür siqnallarla dayandırılmadan yeniləməsinə icazə vermək üçün makro kodu işləyərkən bu siqnalları söndürür.

Şəkil 1. Şərh, dipnot və ya son qeydlərdəki sahələri yeniləməyə çalışarsanız, Word-də göstərilə biləcək xəbərdarlıq. Aşağıdakı yeniləmə sahələri makrosu bu cür xəbərdarlıqları boğur.

Kilidli sahələr makro tərəfindən güncəllənməyəcəkdir

Word'də sahələri kilidləyə bilərsiniz. Sahələrin kilidlənməsinin məqsədi normal olaraq sahələrin güncəllənməsinin qarşısını almaqdır.

Aşağıdakı makro kilidlənmiş sahələri yeniləmir. Bütün kilidlənmiş sahələr dəyişməz olaraq qalacaq. Bununla birlikdə, hər bir sahəni yoxlayan, kilidli olduğu təqdirdə açan, sahəni yeniləyən və yenidən kilidləyən bir makro yaratmaq mümkündür.

Sahələrin əl ilə kilidlənməsi və kilidinin açılması barədə məlumat üçün, sahələrin güncəllənməsinin qarşısını alan kilidli sahələrə baxın.

Makro istifadə etməzdən əvvəl qorunan sənədlər qorunmamalıdır

Sənəd qorunursa, məqsəd normal olaraq sənəddə dəyişiklik və ya müəyyən dəyişikliklərin qarşısını almaqdır. Qorumalı bir sənəd halında, makro bir mesajı göstərir (aşağıda Şəkil 2-yə baxın), makronu çalıştırmadan əvvəl sənədi qoruduğunuzu söyləyin. Beləliklə, sənəddəki sahələri yeniləməyin yaxşı olub-olmamasına qərar verəcəksiniz.

Şəkil 2. Qorunan sənəddəki bütün sahələri yeniləməyə çalışarsanız, bu mesaj göstəriləcəkdir.

Dəyişiklikləri və güncəlləşdirmə sahələrini izləyin - Yeniləmə Sahələri makrosu, yeniləmə zamanı söndürməyə imkan verir

Parça dəyişiklikləri açıldıqda Word sənədindəki sahələri əl ilə yeniləsəniz, hər yenilənmiş sahə köhnə sahənin silindiyi və yenisinin əlavə edildiyi düzəlişlər kimi qeyd olunacaq. Bu, əksər hallarda sənəddəki narahatlıq yaradan səs-küydür. Aşağıdakı makro track dəyişikliklərinin olub olmadığını yoxlayır. Bu vəziyyətdədirsə, makro, Şəkil 3-də mesajı göstərir və sahə yeniləməsi zamanı söndürməyə imkan verir. Bunu etsəniz, iz dəyişiklikləri makro bitmədən yenidən açılacaqdır.

Şəkil 3. Bu mesaj, bütün sahələri yeniləməyə çalışdığınız sənəddə track dəyişiklikləri açıq olduqda göstəriləcəkdir.

Makronu hər hansı bir qorumanı söndürən, sahələri yeniləyən və nəhayət qorumanı orijinala qaytaran kodla genişləndirmək mümkündür.

Makrodakı mətn qutularındakı, formalardakı və sairdəki sahələri yeniləyən kod iki dəfə tapılır. Bu kod əsas makrodan çağırılan bir funksiyaya köçürülə bilər. Bu şəkildə yalnız bir dəfə ehtiyac olardı. Bununla birlikdə, lazımsız kodun VBA ilə yeni tanış olan istifadəçilər üçün daha asan edilməsi üçün yalnız bir alt hissəyə ehtiyac olması üçün icazə verməyə qərar verdim.


Bag_Apaketi qiymətləndirin

Sonra bag_unpack (), bu mənim ən sevdiyim metod ola bilər. Bu metod Log Analytics və guya Azure Sentinel-də işləyir. Application Insights-da sınamamışam, amma orada da işləyəcəyini düşünürəm. Bag_unpack JSON ilə işləyir və iç içə obyektdəki bütün sahələri çıxaracaq və onları öz sahələri halına gətirəcəkdir. İş yoldaşımın xüsusi qeydlərində istifadə etməsini tövsiyə etdiyim şey budur.

Azure AD Giriş Girişlərimizə baxanda bir neçə iç içə sahə var. Dartacağım biri DeviceDetail'dir.

Burada yalnız 3 əsas dəyər cütü verilmişdir, lakin müştərilərimizə müraciət proqramında qeyd etmək lazımdır ki, çıxarmaq üçün lazım olan sahələrin miqdarı çox idi. Və hər bir qeydin fərqli sahələri var idi, buna görə ilk metodu istifadə etmək çox vaxt aparardı.

Bag_unpack-in qiymətləndirilməsi Azure Resource Graph-da mövcud olsa əla olar. Rəyləri Azure portalı vasitəsilə verdim. Bir dəqiqə də saxlaya bilsəydiniz, çox yaxşı olardı.


Bir hesabatda yeni sütununuzdan istifadə edin

İndi yeni istifadə edə bilərsiniz ProductFullCategory baxmaq sütunu SatışAmount tərəfindən ProductFullCategory.

Seçin və ya sürükleyin ProductFullCategory sütunu Məhsullar alt kateqoriyası hamısını göstərən bir cədvəl yaratmaq üçün Report kətan üzərində cədvəl ProductFullCategory adlar.

Seçin və ya sürükleyin SatışAmount sahə Satış göstərmək üçün masaya masanın içinə SatışAmount hər biri üçün ProductFullCategory.


SharePoint 2013 REST-API: Bir siyahı elementinin bütün sahə dəyərlərini almaq üçün etibarlı bir yoldur?

Müəyyən bir siyahı elementinin bütün sahə dəyərlərini SharePoint 2013-ün REST-API vasitəsilə almağa çalışıram. Dəyərlər daha da işlənmək üçün istifadə ediləcək. Məqsəd almaqdır hamısı sahə dəyərlərini dinamik olaraq, lazım olan sahələri əl ilə təyin etmək söz mövzusu deyil. İstəklər Java-Tətbiqdən edilir, buna görə HTTP Tələblərini CSOM və ya JSOM ilə deyil özüm hazırlayıram.

Aşağıdakı fikirləri sınadım, amma qənaətbəxş nəticə vermədən:

/ _Api / web / lists (guid) / items (id) / FieldValuesAsText üçün sadə tələb. Bu yanaşmanın problemi budur ki, bütün dəyərlər Strings olaraq qaytarılır, buna görə JSON ayrıştırıcısından yazılmış dəyərlər almıram. Ayrıca tarixlər kimi bəzi dəyərlər formatlanır, məsələn. ISO-8601 formatında tarixlərə ehtiyac duyduğum üçün "8.08.2014 15:31 PM" istifadə edilə bilməz.

İkinci yanaşmam, əvvəlcə / _api / web / lists (guid) / items (id) / ParentList / Fields ilə mövcud olan bütün sahələri almaq üçün bir seçim etmək və sonra hər bir sahənin EntityPropertyName-i əsas götürərək siyahı maddəsində bir seçim yaratmaq idi. . Bu, / _api / web / lists (guid) / items (id) kimi bir şeylə nəticələnəcək? $ Select = Id, Created, Author. . Məsələ burasındadır ki, məsələn $ select = Author ilə bir sorğu işləmir, çünki müəllifin $ spread-Parametrdə göstərilməsi lazımdır.

'Müəllif' sahəsinə sorğu etibarlı deyil. $ Select sorğu sətri hədəf sahələrini göstərməli və $ genişləndirmə sorğusu sətri müəllifdən ibarət olmalıdır.

Hansı sahələrin genişləndirilməli, hansının olmamasının müəyyənləşdirilməsinə yol tapa bilmədim.

Üçüncü yanaşmam ikinci nömrəyə bənzəyirdi, ancaq hər bir sahəni ayrı bir istəklə siyahı maddəsindən çıxarın: / _api / web / lists (guid) / items (id) / Author. Bununla da genişlənmiş sahə dəyərlərini obyekt kimi ala bilərəm və seçimdə $ genişləndirmə Parametri ilə işləmək məcburiyyətində deyiləm. Bu metodun problemi, yalnız bir siyahı maddəsi üçün təxminən 60 istək olduğu üçün çox yavaş olmasıdır.

Kimsə bir siyahı elementinin bütün sahə dəyərlərini almaq üçün başqa bir üsul bilirmi?


Sifariş

Nümunə məlumatlar

Aşağıdakı cədvəllər bu hissədəki nümunələrlə istifadə olunur.

İşçilər cədvəli

Funksiya Təsvir
Cədvəl Maks ComparisonCriteria istifadə edərək cədvəldən ən böyük sətri və ya sətirləri qaytarır.
Cədvəl.MaxN Cədvəldən ən böyük N sətri qaytarır. Satırlar sıralandıqdan sonra nəticəni daha da süzmək üçün countOrCondition parametri göstərilməlidir.
Cədvəl Min ComparisonCriteria istifadə edərək cədvəldən ən kiçik sətir və ya sətirləri qaytarır.
Cədvəl Min Verilən cədvəldəki ən kiçik N sətri qaytarır. Satırlar sıralandıqdan sonra nəticəni daha da süzmək üçün countOrCondition parametri göstərilməlidir.
Cədvəl Bir cədvəldəki satırları bir müqayisə meyarından və ya təyin edilmədiyi təqdirdə standart sifarişdən istifadə edərək sıralayır.


Nəticə

İndekslər, tətbiqinizin məlumat alışı performansını artırmaq üçün əlinizdə olan güclü bir vasitədir. Verilənlərin sorğu-sualına və çeşidlənməsinə kömək edirlər və indekslərin düzgün istifadə edildiyi zaman axtarışları olduqca sürətli edə bilərlər. Əhatə olunan indekslər bütün fikri növbəti səviyyəyə qaldırır.

İndekslər əlavə xərclərlə də təmin olunur: əlavə yer istifadə edəcək və SQLite indeksləri yeniləməsi lazım olduğu üçün qeydlərin daxil edilməsi və ya yenilənməsi üçün vaxtı artıra bilər. Cədvəlinizə bir indeks əlavə etmədən əvvəl müsbət və mənfi cəhətləri ölçmək vacibdir.

Bu yazı SQLite-dəki indekslərin əsaslarına toxunur, lakin SQLite-in sorğu planlayıcısının necə işlədiyi və rəsmi sənədlərdə indekslərdən istifadəsi barədə çox şey oxuya bilərsiniz. Əlavə olaraq, bu yazını daha əlçatan etmək üçün indekslərin necə qurulduğunu və saxlandığını məqsədyönlü şəkildə izah etdim. SQLite'nin (və digər verilənlər bazalarının) B ağaclarını öyrənərək göstəriciləri necə saxladığı haqqında daha çox məlumat əldə edə bilərsiniz.

Nəhayət, bu yazıda müzakirə etdiyimiz çox şey indekslərin digər verilənlər bazası sistemlərində necə işləməsinə tətbiq edilə bilər.

Bu yazı xoşunuza gəlsə, xahiş edirəm izləyicilərinizə tövsiyə etmək üçün bu ürək düyməsini vurun. Ayrıca, serialımdakı digər yazıları da nəzərdən keçirməlisiniz: “SQLite-dən Sıxan Performans”:


1 Cavab 1

$ GF (2 ^ <128>) $ üzərində vurma əməliyyatı barədə soruşursunuz, belə çıxır ki, 0 elementini xaric etsək, bu dəyişdirilmiş $ 2 ^ <128> -1 $ elementləri üzərində vurma əməliyyatı bir qrup əməliyyatı, məsələn, tərslər mövcuddur.

Və hər hansı bir $ odot $ qrup əməliyyatı üçün:

  • Hər hansı bir $ Y $ elementi üçün təsadüfi (və müstəqil) bir element $ X $ ilə çarparaq, nəticədə $ X odot Y $ təsadüfi olur (və bunu aşkarlamaq $ Y $ haqqında heç bir şey göstərmir).

Bu sualınıza bir cavab verir (sualınız $ X $ dəyişdirilərək 1 element deyil, yalnız 0 element xaric edilsin). Unutmayın, 0 qrupun üzvü deyil (qrupu təyin edərkən onu qəsdən çıxardığımız sahənin üzvü olmasına baxmayaraq) əksinə, 1 qrupun üzvüdür və bunun qarşısını almaq bəzi məlumatları, xüsusən də sızdıracaqdır , $ Y $ olmadığı dəyər (çünki $ Y ne X odot Y $)

Bu sualınıza iki cavab verir.

  • Çox sayda təsadüfi $ X_i $ dəyəri üçün $ X_i odot Y $ -ı aşkarlamaq da $ Y $ haqqında heç bir məlumat ortaya qoymur.

Bu sualınıza üç cavab verir.

Yuxarıda göstərilən problemləri həll etmək çətindirsə, ehtimal ki sonlu sahə vurulması yan kanal üçün əks tədbirin maskalanması üçün bir metod kimi istifadə edilə bilər (ən azı nəzəri olaraq).

Ola bilər, amma ideal olmazdı. Birincisi, 0 dəyərini qəsdən istisna etməli idik ki, maskalanma edən bir real tətbiq, belə bir mümkün xüsusiyyəti görməməzlikdən gələ bilməz, əgər $ Y = 0 $ dəyəriniz olsaydı, maskeleme bu vəziyyətdə işləməzdi. Daha praktik bir qeyddə, maskalanma adətən hesablama tərslərini ehtiva edir və $ GF (2 ^ <128>) $ -dan çox vuruşlu tərsləri hesablayarkən o qədər də çətin deyil, həm də müstəsna deyil.


Nümunələr

Skaler strukturun giriş sahəsi

Bir sahənin dəyərini hansı funksiya ilə qaytarılmış bir quruluşdan alın. göstərilən qovluğa gedən yolu və qovluqdakı müxtəlif növlərin adlarını ehtiva edən skaler quruluşu qaytaran nədir.

Mlx sahəsindəki bütün Canlı Ssenarilərin adlarını qaytarın. Getfield funksiyasından istifadə etdikdə, bu quruluşu saxlamaq üçün müvəqqəti dəyişən istifadə etmədən bir funksiyanın qaytardığı bir sahəyə daxil ola bilərsiniz.

Nöqtə işarəsini istifadə edərək bir sahəyə də daxil ola bilərsiniz.

İç içə quruluş sahəsi

Yerləşmiş bir quruluşun bir sahəsinə daxil olun. İç içə bir quruluşda, istənilən səviyyədə bir quruluş, struktur olan sahələrə və quruluş olmayan digər sahələrə sahib ola bilər.

Əvvəlcə iç içə bir quruluş yaradın.

S bir quruluş olduğu halda, S.a, S.a.b və S.a.b.e sahələri də quruluşdur.

Getfield funksiyasından istifadə edərək S.a.b.d dəyərini qaytarın. İçəridən qurulmuş adların vergüllə ayrılmış siyahısını təyin etdiyiniz zaman, yuxarıdakı quruluşla göstərdiyiniz sahə adı arasındakı hər səviyyədə strukturları daxil etməlisiniz. Bu vəziyyətdə, vergüllə ayrılmış struktur adlarının siyahısı 'a', 'b' və sahə adı 'd' olur.

Eyni sahəyə daxil olmaq üçün nöqtə qeydindən də istifadə edə bilərsiniz.

Struktur Array Element sahəsi

Dir funksiyası ilə qaytarılmış bir struktur massivinin elementindən bir sahənin dəyərini alın. dir elementləri hər birində göstərilən qovluqdakı bir fayl haqqında məlumat olan bir quruluş dizisini qaytarır.

C: Temp qovluğundakı sənədlər haqqında məlumatları qaytarın. Qovluqda 5 fayl var.

5-ci sənəd haqqında məlumatları göstərmək üçün S-yə daxil edin.

Getfield funksiyasından istifadə edərək S-nin 5-ci elementi ilə təsvir olunan sənədin adını qaytarın. Getfield istifadə etdikdə, bir hücrə massivində göstəriciləri göstərin.

Alternativ olaraq, struktur massivinə daxil edin və sonra bir sahəni təyin etmək üçün nöqtə qeydini istifadə edin.

İç içə quruluş massivinin göstəriciləri

Bəzi səviyyələrdəki strukturların quruluş massivləri olduğu iç içə bir quruluş sahəsinə daxil olun. Bu nümunədə S 1-dən 2-yə qədər quruluş massividir. İkinci element S (2) içəridə qurulmuş bir a.b quruluşuna sahibdir, burada b 1-dən 3-ə qədər quruluş massividir.

Əvvəlcə iç içə bir quruluş yaradın. Nöqtə qeydindən istifadə edərək quruluş yaratdıqdan sonra struct funksiyasından istifadə edərək başqa bir nonscalar quruluş massivi yaradın və onu sahə kimi əlavə edin.

Getfield funksiyasından istifadə edərək b-nin üçüncü elementindən d-nin dəyərini qaytarın. Hüceyrəli massivlərdən istifadə edərək həm S, həm də b indekslərini təyin etməlisiniz.


Videoya baxın: Editing Attribute Table in QGIS (Oktyabr 2021).