Rechercher des chaînes à l'aide d'une chaîne partielle<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tout,
J'essaie de rechercher des correspondances de chaînes 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 le faire - mais je ne parviens pas à bien faire les choses. Toute aide serait appréciée .
À titre d'exemple, j'utilise le tableau Air Traffic Sample Data :
// Méthode n° 1 utilisant Pat Match
dt = table de données actuelle();
ColNames = dt << Get COlumn Names();
Match = liste();
sp = Pat Span("ID");
Pat Match(ColNames,sp>>Match);
Match;
// Cela ne donne aucune correspondance . Cependant, dans le même code - si 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 # 2 utilisant Contient()
for( i=1, i<= N Items(ColNames),i++,
Si(Contient(ColNames ","ID")== 1,
Insérer dans(Correspondance,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.
for( icol = 1, icol <= nitems(colnames), icol++,
// utilise regex sur char(colnames ) et sortez de cette boucle lorsque vous obtenez la correspondance dont vous avez besoin.
)
Étant donné que les noms de colonne ont des virgules et que vous avez besoin de l'index icol, la regex 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'ID 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 puis me permettre, j'ai 2 questions de suivi :
1. Comment obtiendriez-vous les indices lorsqu'il y a des correspondances trouvées ?
2. Si les noms de colonne ressemblent à ceci - ce qu'ils font dans mon cas
Nom ("IPhone 7, Californie, Oui") - NomsCol
Nom(\!" iPhone 7 , Californie , Oui \!") - ColString
S'il vous plaît des conseils.
Meilleur
Uday
Re : Rechercher des chaînes à l'aide d'une chaîne partiellepeut-être comme ça :
dt = table de données actuelle();
ColNames = dt << Get COlumn Names();
chaînes de col = carboniser (noms de colonne);
match = regex(colstrings, "[{,]\s*([^{,}]*ID[^{,}]*)[,}]", "\1");
afficher(Correspondance);
Match = "Identifiant du vol" ;
qui dépend des noms de colonne n'utilisant pas de virgules ou d'accolades.La fonction char transforme la liste des noms en une chaîne :
{Compagnie aérienne, code du transporteur, numéro de vol, numéro de queue, ID de vol, événement, aéroport, heure,
Heure d'origine, longitude, latitude}
devient
"{Compagnie aérienne, Code du transporteur, Numéro de vol, Numéro de queue, ID de vol, Événement, Aéroport, Heure, Heure d'origine, Longitude, Latitude}"
J'ai choisi regex pour cela parce que... eh bien, ce ne sera pas beau de toute façon.Décomposer le modèle regex :
"[{,] soit une accolade ouverte, soit une virgule
\s* espace blanc facultatif
([^{,}]*ID[^{,}]*) les parenthèses extérieures sont la correspondance \1 (plus ci-dessous)
[,}]" soit une virgule soit une accolade fermante
décomposant 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 regex, "\1", signifie utiliser la première parenthèse ouverte pour identifier le texte de remplacement.