Regular expression

martedì 07 ottobre 2014 - 11.29

memmo77 Profilo | Expert

Ho vari ssis nei quali sono presenti dei task nei quali sono presenti tabelle derivate con colonne del tipo i2, quindi smallint.
Per cambiamenti di programma questi dati, arrivano ora in formato i4, int.
Ho pensato di modificare direttamete il file .dtsx individuando i vari record e modificando il data type da i2 a i4.
Il problema è che questi sono molto grandi ed ho pensato all'utilizzo delle espressioni regolari di notepad++ per trovare le corrispondenze.

In sostanza un esempio potrebbe essere questo:
A mi interessa, testo che non mi interessa, B mi interessa, questo altro testo non mi interessa.

In pratica l'espressione dovrebbe cercare e trovare la corrispondenza A + B all'interno del record.
Sapreste come scrivere un'espressione regolare che mi individui tale corrispondenza?

Grazie a tutti
Ciao!!!

0v3rCl0ck Profilo | Guru

Ciao Domenico,

mi passeresti un frammento del file per vedere come potere creare una regular expression che chiedi.


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

memmo77 Profilo | Expert

Questo ad esempio è un record del file:

<outputColumn id="241" name="FK_ID" description="" lineageId="241" precision="0" scale="0" length="0" dataType="i2" codePage="0" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed" externalMetadataColumnId="0" mappedColumnId="0"><properties>

Dovrei individiare la presenza di:
name="FK_ID" e dataType="i2"

poi modificare dataType="i2" in dataType="i4"

Grazie mille ciao!

0v3rCl0ck Profilo | Guru

prova così con notepad++:

Find what:
(name="FK_ID".*)dataType="i2"

Replace with:
${1}dataType="i4"


888x696 43Kb


fammi sapere

Ciao!
Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

memmo77 Profilo | Expert

Direi che è perfetto, funziona alla grande, ora devo capire cosa hai scritto come espressione regolare, ma quello è un altro "problema" .
Per il momento grazi mille!

0v3rCl0ck Profilo | Guru

Ecco un po' di analisi sulla regular che ti ho passato...

analizzando:
(name="FK_ID".*)dataType="i2"

() Le parentesi servono a creare un gruppo numerato di match, che può poi essere letto separatamente da tutto il contesto in match, in altre parole serve ad estrapolare una parte di match, quella che a volte ci interessa rispetto ad un match più ampio.
(?<NomeGruppo>) Esistono anche i named group, sono come i precedenti, solo che è possibile dare un nome al gruppo, e successivamente trovare tale gruppo usando un nome come chiave invece che l'indice.
. Il punto prende (quasi) qualsiasi carattere, e ti invito a leggere il mio post: http://blogs.dotnethell.it/Regulator/RegEx-Il-punto-prende-quasi-qualsiasi-carattere__13264.aspx
* E' un token di ripetizione, e vuol dire prendi 0 o più volte il carattere, set o gruppo che precede. Quindi .* vuol dire prendi qualsiasi carattere e non ti fermare se non ce ne dovessero essere.
+ Anche il più è un token di ripetizione, e vuol dire prendi 1 o più volte il carattere, set o gruppo che precede. Quindi la differenza tra .* e .+ è che con il più, il match fallirebbe se non ci fosse alcun carattere da prendere.

Tutto il resto dei caratteri name="FK_ID" e dataType="i2" sono literal token per il motore regex. Un token è un carattere o più a formare una regola per il motore, i più semplici sono i literal e cioè appunto qualsiasi cosa che non sia un carattere speciale, quindi name="FK_ID" ecc... sono visti come semplici caratteri che devono essere presenti nella posizione corretta nella stringa sorgente su cui si sta effettuando la ricerca.

invece analizzando l'espressione di replace:
${1}dataType="i4"

${} rappresenta il match del solo gruppo numerato 1 (il gruppo 0 contiene tutto il match completo!)
${NomeGruppo} questa è l'alternativa al precedente, se invece tu avessi un named group al posto del numbered group (?<NomeGruppo>.*)

ATTENZIONE perchè regex non viene sempre implementato utilizzando lo standard IEEE POSIX (http://en.wikipedia.org/wiki/Regular_expression#Standards), e quindi a volte certi caratteri speciali possono differire tra motore e motore. Specialmente quando si parla di replace, dove non credo sia proprio definito uno standard, semplicemente il più dei linguaggi cerca di avere uno standard in comune.

Puoi fare un po' di pratica sfruttando qualche strumento per la compilazione e l'esecuzione di regular expression, vedi il mio post per un elenco completo: http://blogs.dotnethell.it/Regulator/RegEx-Software-per-testare-le-vostre-Regular-Expression__10902.aspx
Anche quelli online sono veramente comodi e fatti bene, come http://www.regexr.com/ oppure http://regex101.com/
Per me il migliore in assoluto per desktop è RegexBuddy (30 euro spesi benissimo!) ha anche il debugger!!


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

memmo77 Profilo | Expert

Grazie infinite della guida, sto leggendo ora le tue guide e ho visto i link che mi hai passato. Mi è venuto in mente proprio ora che l'utilizzo delle espressioni regolari potrebbero tornarmi davvero utili in un altro ambito, ma il contesto è leggermente diverso. Questo potrebbe essere un esempio del record che dovrei controllare:

000072420001143000015000320111847 0000000000000000000000000000000000000000000

Ma la cosa sarebbe leggermente + complicata, seeeee vuoiiiii, ti spego perchè
Grazie mille già così!
Ciao

0v3rCl0ck Profilo | Guru

Vai spara, però ti chiedo soltanto di aprire un thread dedicato, per non fare troppa confusione su un singolo thread grazie



Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5