Suite

Itérer dans tous les champs de la table attributaire et multiplier par champ


J'ai un tableau avec tout un tas de variables de recensement (race, âge, éducation, etc.). Je veux multiplier tous ces champs par un facteur que j'ai calculé. Par exemple:

Champ1 a des valeurs de 10,20,30,40

Champ2 a des valeurs de 120,340,230,210

Le champ3 a des valeurs de 500 3402 0342 9402

Le champ multiplicateur a des valeurs de 0,1, 0,2, 0,3, 0,4

Je veux « itérer » à travers toutes les colonnes et les multiplier par mon champ multiplicateur. Traditionnellement, j'utilisais la calculatrice de champ et je faisais !Field1! * !Multiplicateur!, mais j'essaie d'éviter d'avoir à le faire pour plus de 200 champs.

Aucune suggestion?

J'utilise ArcMap 10.2.2.


Si je comprends bien, chaque ligne a une valeur dans le champ "Multiplicateur", par laquelle vous souhaitez multiplier les valeurs dans tous les autres champs.

Le calculateur de champs ne fait qu'un champ à la fois, bien que vous puissiez l'exécuter en mode batch. Pour plus de 200 champs, je recommanderais un code comme celui-ci qui utilise un curseur de recherche. Mettez-le dans la console python.

layer = 'layername' #drag from TOC multfield = "multiplier field name" fieldnames = [i.name for i in arcpy.ListFields(layer) sinon i.required] ind = fieldnames.index(multfield) #maintenant vous savez où il est dans la liste avec arcpy.da.UpdateCursor(layer,fieldnames) comme curseur : pour la ligne dans le curseur : pour n dans la plage(len(fieldnames)): if n == ind : continue #ne met pas à jour le champ multiplicateur ligne[n] = ligne[n]*ligne[ind] curseur.updateRow(ligne)

Cela suppose que vous voulez multiplier tous champ par le multiplicateur, outre le multiplicateur lui-même, et tous les champs automatiques comme "OBJECTID". Si vous avez des champs de texte, vous obtiendrez une erreur.


Quelle est la meilleure façon de parcourir le tableau pour mettre à jour une colonne dans chaque ligne ?

J'ai un tableau contenant quelque 3,2 milliards de lignes. Il est devenu nécessaire d'ajouter dans une colonne intitulée [Daylight] avec un type de données de bit. J'ai fini par écrire une déclaration pour parcourir chaque station, pour chaque jour de l'année. Cela prend tellement de temps que j'explore maintenant d'autres options, avec l'avantage supplémentaire d'apprendre (espérons-le) quelque chose en cours de route. J'ai caressé l'idée de créer une table secondaire qui contiendrait les valeurs du lever et du coucher du soleil pour chaque jour de l'année, mais ce serait aussi une grande table (plus de 30 000 stations, avec une plage de 1 à 50 ans et plus de collecte de données).

Existe-t-il une meilleure façon de s'acquitter de cette tâche? Je cherche vraiment un doigt pointé dans la bonne direction car cela fait plus de 10 ans que j'utilise SQL. Dans un avenir proche, des tables supplémentaires seront créées pour stocker diverses moyennes des données dans lesquelles le jour/la nuit deviendra important. Alors que je connais les maths devrait être fait par le front-end ou au moment de la requête, ce sont toutes des données statiques qui ne changeront pas, j'ai donc pensé qu'il serait préférable de les stocker plutôt que de les calculer plusieurs fois.

Vous trouverez ci-dessous le script que j'exécute actuellement pour mettre à jour la colonne (en supposant qu'il fonctionne même réellement, car la table est maintenant verrouillée).

Merci d'avance pour toute aide ou suggestion !

Modifié pour les informations demandées. Merci @JoeObbish.

Juste pour une divulgation complète et au cas où quelqu'un d'autre serait assez stupide pour faire les mêmes erreurs que moi. J'ai fini par changer les procédures stockées appelées dans mon script initial en UDF, puis j'ai écrit une autre UDF qui a appelé ces deux et effectué les différentes instructions conditionnelles Je cherchais. Ainsi, plutôt que le script trop détaillé ci-dessus, j'exécute plutôt quelque chose de similaire à ce qui suit.

Cela a été exécuté sur une table de test qui contenait 10 millions de lignes sans aucune clé ni index et a pu mettre à jour avec succès (et avec précision) le champ dans chaque ligne en 34 minutes et 59 secondes. Des performances bien meilleures qu'environ 8 heures pour 300 000 lignes.

Encore une fois, merci pour les conseils et l'orientation. C'est vraiment apprécié.


Ce que vous devez savoir sur la macro de mise à jour des champs

La macro ci-dessous mettra à jour tous les champs du document Word actif, peu importe où se trouvent les champs. En utilisant une macro pour mettre à jour les champs, il vous suffit d'exécuter la macro pour que tous les champs soient mis à jour. Alternativement, vous devrez peut-être effectuer un certain nombre d'actions manuelles pour vous assurer que tous les champs sont mis à jour s'ils sont répartis dans différentes parties de Word, telles que l'article principal, les en-têtes, les pieds de page, les notes de bas de page, les notes de fin, les zones de texte et autres formes.

Notez que la macro comprend un certain nombre de commentaires qui expliquent un peu ce qui se passe. Les informations après le code de macro ci-dessous le couvriront plus en détail.

Vous pouvez copier le code de la macro ci-dessous et l'insérer soit dans votre fichier Normal.dotm, soit dans un autre fichier Word de votre choix. Pour obtenir de l'aide sur l'installation d'une macro, consultez Comment installer une macro.

Les avertissements pouvant s'afficher si vous mettez à jour manuellement les champs dans Word sont automatiquement supprimés lors de l'utilisation de la macro Mettre à jour les champs

Si vous essayez de mettre à jour manuellement les champs dans commentaires, notes de bas de page et notes de fin, Word peut afficher un avertissement comme illustré dans la figure 1 ci-dessous, indiquant que l'action ne peut pas être annulée. Pour permettre à la macro de mise à jour des champs de mettre à jour tous les champs n'importe où dans le document sans être arrêté par de telles alertes, le code de la macro désactive ces alertes lors de l'exécution.

Figure 1. Avertissement pouvant s'afficher dans Word si vous essayez de mettre à jour des champs dans un commentaire, une note de bas de page ou une note de fin. La macro de champs de mise à jour ci-dessous supprime ces avertissements.

Les champs verrouillés ne seront pas mis à jour par la macro

Vous pouvez verrouiller des champs dans Word. Le but du verrouillage des champs est normalement que vous souhaitez empêcher la mise à jour des champs.

La macro ci-dessous ne met pas à jour les champs verrouillés. Tous les champs verrouillés resteront inchangés. Il est cependant possible de créer une macro qui vérifie chaque champ individuel, le déverrouille s'il est verrouillé, met à jour le champ et le verrouille à nouveau.

Pour plus d'informations sur le verrouillage et le déverrouillage manuels des champs, consultez Comment empêcher la mise à jour des champs – champs verrouillés.

Les documents protégés ne doivent pas être protégés avant d'utiliser la macro

Si un document est protégé, le but est normalement d'empêcher toute modification ou certaines modifications à apporter au document. Dans le cas d'un document protégé, la macro affiche un message (voir Figure 2 ci-dessous), vous indiquant de déprotéger le document avant d'exécuter la macro. Ainsi, c'est à vous de décider s'il est acceptable de mettre à jour les champs du document.

Figure 2. Ce message s'affichera si vous essayez de mettre à jour tous les champs d'un document protégé.

Suivre les modifications et mettre à jour les champs - la macro Mettre à jour les champs vous permet de la désactiver pendant la mise à jour

Si vous mettez à jour manuellement des champs dans un document Word alors que le suivi des modifications est activé, chaque champ mis à jour sera marqué comme révisions où l'ancien champ est supprimé et un nouveau ajouté. Il s'agit le plus souvent d'un bruit dérangeant dans le document. La macro ci-dessous vérifie si le suivi des modifications est activé. Si tel est le cas, la macro affiche le message de la figure 3, vous permettant de le désactiver pendant la mise à jour du champ. Si vous le faites, le suivi des modifications sera à nouveau activé avant la fin de la macro.

Figure 3. Ce message s'affichera si le suivi des modifications est activé dans le document dans lequel vous essayez de mettre à jour tous les champs.

Il est possible d'étendre la macro avec du code qui désactive toute protection, met à jour les champs et rétablit enfin la protection à l'original.

Le code de la macro qui met à jour les champs dans les zones de texte, les formes, etc. se trouve deux fois. Ce code pourrait être déplacé vers une fonction appelée à partir de la macro principale. De cette façon, il ne serait nécessaire qu'une seule fois. Cependant, j'ai décidé d'autoriser le code redondant afin qu'un seul sous-marin soit nécessaire, ce qui le rend plus simple pour les utilisateurs qui découvrent VBA.


Évaluer Bag_Unpack

Ensuite, bag_unpack(), c'est peut-être ma méthode préférée. Cette méthode fonctionne dans Log Analytics et apparemment Azure Sentinel. Je ne l'ai pas essayé dans Application Insights, mais je parierais que cela fonctionne aussi là-bas. Bag_unpack fonctionne avec JSON et extraira tous les champs de l'objet imbriqué et en fera leurs propres champs. C'est ce que j'ai fini par recommander à mon collègue d'utiliser sur leurs journaux personnalisés.

En regardant nos journaux de connexion Azure AD, il y a quelques champs imbriqués. Celui que je vais utiliser est DeviceDetail.

Certes, il n'y a que 3 paires clé-valeur ici, mais soyez assuré que dans les journaux d'application de nos clients, la quantité de champs qu'il fallait extraire était importante. Et chaque enregistrement avait des champs différents, donc l'utilisation de la première méthode prendrait beaucoup de temps.

Ce serait formidable si évaluer bag_unpack devenait disponible dans Azure Resource Graph. J'ai fourni les commentaires via le portail Azure. Si vous pouviez consacrer une minute, ce serait formidable si vous le pouviez aussi.


Utiliser votre nouvelle colonne dans un rapport

Vous pouvez maintenant utiliser votre nouveau ProductFullCatégorie colonne à regarder Montant des ventes par ProductFullCatégorie.

Sélectionnez ou faites glisser le ProductFullCatégorie colonne de la Sous-catégorie de produits tableau sur le canevas du rapport pour créer un tableau montrant tous les ProductFullCatégorie noms.

Sélectionnez ou faites glisser le Montant des ventes champ de la Ventes tableau dans le tableau pour montrer le Montant des ventes pour chaque ProductFullCatégorie.


REST-API SharePoint 2013 : moyen fiable de récupérer toutes les valeurs de champ d'un élément de liste ?

J'essaie de récupérer toutes les valeurs de champ d'un élément de liste spécifique via l'API REST de SharePoint 2013. Les valeurs seront utilisées pour un traitement ultérieur. Le but est de récupérer tous les valeurs des champs de manière dynamique, il est donc hors de question de spécifier manuellement les champs requis. Les requêtes sont effectuées à partir d'une application Java, je construis donc moi-même les requêtes HTTP et non avec CSOM ou JSOM.

J'ai essayé les idées suivantes, mais sans résultats satisfaisants :

Requête simple à /_api/web/lists(guid)/items(id)/FieldValuesAsText . Le problème avec cette approche est que toutes les valeurs sont renvoyées sous forme de chaînes, donc je ne reçois pas de valeurs tapées de l'analyseur JSON. Certaines valeurs comme les dates sont également formatées, par ex. "8/8/2014 3:31 PM", ce qui n'est pas utilisable, car j'ai besoin de dates au format ISO-8601.

Ma deuxième approche consistait à faire d'abord une sélection pour récupérer tous les champs disponibles avec /_api/web/lists(guid)/items(id)/ParentList/Fields, puis à créer une sélection sur l'élément de liste, en fonction de l'EntityPropertyName de chaque champ . Cela donnerait quelque chose comme /_api/web/lists(guid)/items(id)?$select=Id,Created,Author. . Le problème est que, par exemple, une requête avec $select=Author ne fonctionne pas, car Author doit être spécifié dans le $expand-Parameter.

La requête au champ 'Auteur' n'est pas valide. La chaîne de requête $select doit spécifier les champs cibles et la chaîne de requête $expand doit contenir Author.

Et je n'ai pas pu trouver un moyen de déterminer quels domaines doivent être étendus et lesquels ne le sont pas.

Ma troisième approche était similaire au numéro deux, mais récupère chaque champ de l'élément de liste avec une requête distincte : /_api/web/lists(guid)/items(id)/Author . Avec cela, je peux également récupérer des valeurs de champ étendues en tant qu'objets et ne pas avoir à gérer un $ expand-Parameter dans le fichier select. Le problème avec cette méthode est qu'elle est très lente car il y a environ 60 requêtes exécutées pour un seul élément de liste.

Est-ce que quelqu'un connaît une autre méthode pour récupérer toutes les valeurs de champ d'un élément de liste ?


Commande

Exemple de données

Les tableaux suivants sont utilisés par les exemples de cette section.

Tableau des employés

Une fonction La description
Tableau.Max Renvoie la ou les plus grandes lignes d'une table à l'aide d'un ComparaisonCriteria.
Table.MaxN Renvoie les N plus grandes lignes d'une table. Une fois les lignes triées, le paramètre countOrCondition doit être spécifié pour filtrer davantage le résultat.
Table.Min Renvoie la ou les plus petites lignes d'un tableau à l'aide d'un comparatifCriteria.
Table.MinN Renvoie les N lignes les plus petites du tableau donné. Une fois les lignes triées, le paramètre countOrCondition doit être spécifié pour filtrer davantage le résultat.
Tableau.Tri Trie les lignes d'un tableau à l'aide d'un critère de comparaison ou d'un ordre par défaut s'il n'est pas spécifié.


Conclusion

Les index sont un outil puissant à votre disposition pour augmenter les performances de récupération des données de votre application. Ils aident à interroger et à trier les données, et lorsque les index de couverture sont utilisés correctement, ils peuvent rendre les recherches incroyablement rapides. Les index de couverture font passer l'idée au niveau supérieur.

Les index entraînent également une surcharge : ils utiliseront de l'espace supplémentaire et peuvent augmenter le temps nécessaire pour insérer ou mettre à jour les enregistrements, car SQLite doit maintenir les index à jour. Il est important de peser le pour et le contre avant d'ajouter un index à votre table.

Cet article aborde les bases des index dans SQLite, mais vous pouvez en savoir beaucoup plus sur le fonctionnement du planificateur de requêtes de SQLite et son utilisation des index dans la documentation officielle. De plus, dans le but de rendre ce post plus accessible, j'ai délibérément passé sous silence la façon dont les index sont construits et maintenus. Vous pouvez en savoir plus sur la façon dont SQLite (et d'autres bases de données) maintiennent les index en vous familiarisant avec les B-trees.

Enfin, une grande partie de ce dont nous avons discuté dans cet article peut être appliquée au fonctionnement des index dans d'autres systèmes de base de données.

Si vous avez apprécié cet article, veuillez appuyer sur ce bouton en forme de cœur pour le recommander à vos abonnés. En outre, vous devriez consulter les autres articles de ma série : « Squeezing Performance from SQLite » :


1 réponse 1

Vous posez des questions sur l'opération de multiplication sur $GF(2^<128>)$ il s'avère que, si nous excluons l'élément 0, alors l'opération de multiplication sur cet ensemble modifié d'éléments $2^<128>-1$ est une opération de groupe par exemple, les inverses existent.

Et, pour toute opération de groupe $odot$ , nous avons :

  • Pour tout élément $Y$ , si nous le multiplions par un élément aléatoire (et indépendant) $X$ , le résultat $X odot Y$ est aléatoire (et le révéler ne révèle rien sur $Y$ ).

Cela répond à votre question 1 (votre question étant modifiée en faisant exclure $X$ l'élément 0 uniquement, pas l'élément 1) . N'oubliez pas que 0 n'est pas membre du groupe (même s'il est membre du champ, nous l'avons délibérément exclu lors de la définition du groupe) en revanche, 1 est membre du groupe, et l'éviter entraînerait une fuite d'informations, notamment , la valeur que $Y$ n'est pas (car $Y e X odot Y$ )

Cela répond à votre question deux.

  • Révéler $X_i odot Y$ pour un grand nombre de valeurs $X_i$ aléatoires ne révèle pas non plus d'informations sur $Y$ .

Cela répond à votre troisième question.

Si les problèmes ci-dessus sont difficiles à résoudre, la multiplication de champ fini peut probablement être utilisée comme méthode de masquage de contre-mesure pour le canal latéral (au moins théoriquement).

C'est possible, mais ce ne serait pas l'idéal. D'une part, nous avons dû délibérément exclure la valeur 0, une implémentation réelle qui masque ne peut pas ignorer une telle valeur possible en particulier, si vous aviez une valeur $Y=0$, le masquage ne fonctionnerait pas dans ce cas. Sur une note plus pratique, le masquage impliquerait généralement le calcul d'inverses, et bien que le calcul d'inverses multiplicatifs sur $GF(2^<128>)$ ne soit pas si difficile, ce n'est pas non plus exceptionnellement trivial.


Exemples

Champ d'accès de la structure scalaire

Obtenez la valeur d'un champ à partir d'une structure renvoyée par la fonction what. ce qui renvoie une structure scalaire avec des champs contenant le chemin d'accès au dossier spécifié et les noms de divers types de fichiers dans le dossier.

Renvoie les noms de tous les Live Scripts répertoriés dans le champ mlx. Lorsque vous utilisez la fonction getfield, vous pouvez accéder à un champ de la structure renvoyée par une fonction sans utiliser de variable temporaire pour contenir cette structure.

Vous pouvez également accéder à un champ en utilisant la notation par points.

Champ de structure imbriquée

Accédez à un champ d'une structure imbriquée. Dans une structure imbriquée, une structure à n'importe quel niveau peut avoir des champs qui sont des structures et d'autres champs qui ne sont pas des structures.

Tout d'abord, créez une structure imbriquée.

Alors que S est une structure, les champs S.a , S.a.b et S.a.b.e sont également des structures.

Renvoie la valeur de S.a.b.d à l'aide de la fonction getfield. Lorsque vous spécifiez une liste de noms de structures imbriqués séparés par des virgules, vous devez inclure les structures à chaque niveau entre la structure en haut et le nom de champ que vous spécifiez. Dans ce cas, la liste des noms de structure séparés par des virgules est 'a','b' et le nom de champ est 'd' .

Vous pouvez également utiliser la notation par points pour accéder au même champ.

Champ de l'élément du tableau de structure

Récupère la valeur d'un champ à partir d'un élément d'un tableau de structure renvoyé par la fonction dir. dir renvoie un tableau de structure dont les éléments contiennent chacun des informations sur un fichier dans le dossier spécifié.

Renvoie des informations sur les fichiers dans le dossier C:Temp . Il y a 5 fichiers dans le dossier.

Pour afficher des informations sur le 5ème fichier, indexez-le dans S .

Renvoie le nom du fichier décrit par le 5ème élément de S en utilisant la fonction getfield. Lorsque vous utilisez getfield , spécifiez des indices dans un tableau de cellules.

Comme alternative, indexez dans le tableau de structure, puis utilisez la notation par points pour spécifier un champ.

Indices du tableau de structures imbriquées

Accédez à un champ d'une structure imbriquée, dans laquelle les structures à certains niveaux sont des tableaux de structures. Dans cet exemple, S est un tableau de structure 1 par 2. Le deuxième élément, S(2) , a une structure imbriquée a.b , où b est un tableau de structure 1 par 3.

Tout d'abord, créez une structure imbriquée. Après avoir créé la structure à l'aide de la notation par points, créez un autre tableau de structure non scalaire à l'aide de la fonction struct et ajoutez-le en tant que champ.

Renvoie la valeur de d à partir du troisième élément de b à l'aide de la fonction getfield. Vous devez spécifier les indices de S et de b à l'aide de tableaux de cellules.


Voir la vidéo: Comment ajouter, éditer et supprimer un champs dans une table dattributs dans QGIS? (Octobre 2021).