Problème
Vous avez une chaîne de texte qui a un motif répétitif. Vous souhaitez extraire des données de la chaîne dans une table de données. Chaque répétition dans la chaîne représente une ligne dans la table. Il peut y avoir beaucoup de données à ignorer car elles n'appartiennent pas à la table.
Solution
Utilisez le JSL PatMatch une fonction. Vous devrez utiliser les fonctions pat___ pour créer un motif. L'exemple suivant crée une table de données de liens trouvés sur une page Web.
site = "https://en.wikipedia.org";
url = "/wiki/JMP_(statistical_software)";
html = Load Text File( site || url ); // Dec 2017: 200+ links here
quote = "\!""; // simplify escaping of quotation mark elsewhere
dt = New Table( url, New Column( "link", Character ), New Column( "text", Character ) );
// A typical link looks like this on Wikipedia:
//<A href="https://st.wikipedia.org/" lang="st" target="_blank" rel="nofollow noopener noreferrer">Sesotho</A>
// the following pattern will need tweaking for other sites.
rc = Pat Match( html, //
Pat Repeat( // until there are no more
Pat Break( "<" ) + // match up to, but not including, the <
(// either we've found a link with <A>> vlink + Pat Break( ">" ) // store match in vlink
// throw away the closing > then capture everything up to the
// closing </A>. this may include other tags
+ ">" + Pat Arb() >> vtext + "" + // store match in vtext
Pat Fence() + // fence off previously parsed data, back-up-and-retry is pointless
Pat Test( // inject some JSL into the match to save the results
If( Starts With( vlink, "#" ), // ignore in-page anchors
{} // nothing
, // else
If( Starts With( vlink, "/" ), // within site links begin with /
vlink = site || vlink; // fully qualified
);
dt << addrows( 1 ); // extend the table by one row
dt:link = vlink; // vlink and vtext are the JSL variables
dt:text = vtext; // link and text are the table variables
); //
1; // PatTest needs a true result to keep going
) //
) //
| // or we found something else and can just skip it
Pat Break( ">" ) // match up to the closing > and throw it away
) //
) //
);
Data table of links and associated textTableau de données des liens et du texte associé
Discussion
Votre modèle sera différent. les caractères font partie de la spécification HTML et le correcteur de modèle les utilise pour rechercher les liens dans le texte. Vos données suivront un autre modèle. Vous voudrez PatFence et le PatTest, mais vous voudrez aussi changer tous les cas spéciaux dans PatTest Pour cet exemple html, les liens commençant par le signe # ne sont que des ancres dans une page Web (ils font défiler la page vers une section lorsque l'utilisateur clique dessus), de sorte que le code les ignore. Sinon, le lien devrait être enregistré. Si les liens sont enregistrés, le site est ajouté au début s'ils commencent par un /. Vous devrez peut-être gérer des détails similaires.
Voir également
https://community.jmp.com/t5/Uncharted/Pattern-Matching/ba-p/21005