Rechercher des chaînes à l'aide d'une chaîne partielle<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tous,
J'essaie de rechercher des correspondances de chaîne avec une chaîne partielle comme critère de recherche. J'ai essayé plusieurs façons, comme je le montre ci-dessous - je pense qu'il doit y avoir une meilleure façon d'utiliser RegEx ou Pat Match pour ce faire - mais je n'arrive pas à bien faire les choses. Toute aide serait appréciée .
À titre d'exemple, j'utilise le tableau d'échantillons de données sur le trafic aérien :
// Méthode n°1 utilisant Pat Match
dt = Table de données actuelle ();
ColNames = dt << Obtenir les noms de colonnes ();
Correspondance = liste();
sp = Pat Span("ID");
Pat Match(ColNames,sp>>Match);
Correspondre;
// Cela ne donne aucune correspondance. Cependant, dans le même code – si l'ID lui-même était un nom de colonne – cela fonctionne. Je veux donc comprendre comment utiliser une partie de la chaîne de recherche pour effectuer la recherche.
// Méthode n°2 utilisant Contains()
pour( i=1, i<= N Items(ColNames),i++,
Si (Contient (NomsCol ,"ID")== 1,
Insérer dans (Match,i);
);
);
Meilleur
aujourd'hui
Re : Rechercher des chaînes à l'aide d'une chaîne partielleOn dirait qu'une boucle explicite sera plus facile et plus claire.
pour( icol = 1, icol <= nitems(colnames), icol++,
// utilise l'expression régulière sur char (noms de colonne ) et sortez de cette boucle lorsque vous obtenez la correspondance dont vous avez besoin.
)
Étant donné que les noms de colonnes ont des virgules et que vous avez besoin de l'index icol, l'expression régulière peut être beaucoup plus simple.Ce n'est pas testé, mais quelque chose comme
if( ! ismissing( regex( char(colnames[ icol ]), "ID" ) ), break() );
testerait chaque icône pour l'identification dans le nom.regex renvoie manquant si la correspondance échoue.
Re : Rechercher des chaînes à l'aide d'une chaîne partielleCraige@JMP :
Bien que la solution que vous avez fournie fonctionne, si je peux me permettre, j'ai 2 questions complémentaires :
1. Comment obtiendriez-vous les indices lorsque des correspondances sont trouvées ?
2. Si les noms de colonnes ressemblent à ceci – ce qui est le cas dans mon cas
Nom( "IPhone 7, Californie, Oui") - ColNames
Nom(\!" iPhone7 , Californie , Oui \!") -ColString
S'il vous plaît, des conseils.
Meilleur
Oujour
Re : Rechercher des chaînes à l'aide d'une chaîne partiellepeut-être comme ça :
dt = Table de données actuelle ();
ColNames = dt << Obtenir les noms de colonnes ();
colstrings = carboniser (noms de famille);
match = regex(colstrings, "[{,]\s*([^{,}]*ID[^{,}]*)[,}]", "\1");
show(Correspondance);
Correspondance = « ID de vol » ;
qui dépend des noms de colonnes n'utilisant pas de virgules ou d'accolades.La fonction char transforme la liste de noms en chaîne :
{Compagnie aérienne, code de transporteur, numéro de vol, numéro de queue, identifiant de vol, événement, aéroport, heure,
Heure d'origine, longitude, latitude}
devient
"{Compagnie aérienne, code de transporteur, numéro de vol, numéro de queue, identifiant de vol, événement, aéroport, heure, heure d'origine, longitude, latitude}"
J'ai choisi regex pour ça parce que... eh bien, ce ne sera pas beau de toute façon.Décomposer le modèle regex :
"[{,] soit une accolade ouvrante, soit une virgule
\s* espace blanc facultatif
([^{,}]*ID[^{,}]*) les parenthèses extérieures sont la correspondance \1 (plus ci-dessous)
[,}]" soit une virgule ou une accolade fermante
décomposer la partie \1 :
[^{,}]* zéro ou plusieurs caractères autres que des accolades ou des virgules
Identifiez le mot que vous recherchez dans un nom de colonne
[^{,}]* zéro ou plusieurs caractères autres que des accolades ou des virgules
le troisième argument de l'expression régulière, "\1", signifie utiliser la première parenthèse ouverte pour identifier le texte de remplacement.