Normalizzare file di testo con Espressioni Regolari

martedì 10 maggio 2011 - 09.03

franco.geko Profilo | Junior Member

Ciao a tutti.
Ho il seguente problema:
dovrei 'normalizzare' un file di testo con una sola stringa in un file con N righe.
Il carattere di "a capo" è lo spazio.
Il problema è identificare gli spazi "corretti" dato che si potrebbe trovare anche all'interno di descrizioni.

Esempio:
Devo trasformare la seguente stringa
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In questa
DXS*NEC0800000*VA*V0/6*1 ST*001*0001 ID1*NEC00800000*SAMBA TOP SOFT VEND****00800000 ID4*2 ID5*990518*042129 CB1***1.8 VA1*252*66*179*5 VA2*408*21*0*0 VA3*0*0*0*0 BA1*000000000000*125 EUROPE *0001 CA1*0968G801618 *CF7900MDB *0121 CA2*95*5*75*2 CA3*1220*100*120*1000*1240*100*140*1000*1000*1000 CA4*75*0*75*0 CA7*0*0 CA8*0*0 CA10*0*0 CA11*5*0*0**4*0 CA11*10*0*0**0*0 CA11*20*1*0**1*0 CA11*50*2*0**2*0 CA11*100*1*1**1*1 CA11*200*0*0**0*0 CA14*500*0*0*0*0 CA14*1000*1*1*1*1 CA15*775 CA17*1*5*13*0*0 CA17*2*10*11*0*0 CA17*3*20*10*0*0 CA17*4*50*8*0*0 CA17*5*100*0*0*0 CA17*6*200*0*0*0 DA1*000000000000*000000000038*0174 DA2*157*9*104*3 DA4*1070*1070 DA5*0*0*5*1*0**0 DA7*1*104***9*3*157 DA7*2*0***0*0*0 DA7*3*0***0*0*0 DA7*4*0***0*0*0 DA7*5*0***0*0*0 TA2*0*0*0*0 EA1*EAR*990510*045414 EA2*EAR****0 EA1*EAR*990510*050030 EA2*EAR****0 EA1*EOC*990511*052131 EA2*EOC****0 EA1*EAR*990513*012551 EA2*EAR****0 EA1*EAR*990513*015757 EA2*EAR****0 EA1*ECN*990513*020618 EA2*ECN****0 EA1*EAR*990513*020702 EA2*EAR****0 EA1*ECN*990513*022427 EA2*ECN****0 EA1*ECN*990513*023603 EA2*ECN****0 EA1*ECN*990513*023933 EA2*ECN****0 EA1*EAR*990513*024448 EA2*EAR****0 EA1*ECN*990513*030305 EA2*ECN****0 EA1*ECN*990513*030648 EA2*ECN****0 EA1*ECN*990515*230328 EA2*ECN****0 EA1*EAR*990515*230412 EA2*EAR****0 EA7*0*112 EA3*234*110309*1501*0000*000000*0000*0000 MA1**SINGLE PA1*10*100* *20*20*1*1*20*5 PA2*0*0*0*0*1*5*0*0 PA3*0**0 PA4*0*0*0 PA5***0 PA1*11*35* *20*20*1*1*0*5 PA2*21*124*3*101*0*0*0*0 PA3*4**0 PA4*0*0*0 PA5*990513*022158*0 PA1*12*100* *20*20*1*1*20*5 PA2*0*0*0*0*0*0*0*0 PA3*0**0 PA4*0*0*0 PA5***0 PA1*13*40* *20*20*1*1*9*5 PA2*11*128*2*78*0*0*0*0 PA3*0**0 PA4*0*0*0 PA5***0 PA1*14*100* *20*20*1*1*20*5

Praticamente ogni riga formattata dovrebbe essere composta in questo modo:
Un identificatore di riga (DXS, ID1, ID4...etc), un numero variabile di campi separati dall'asterisco (*)

Il mio problema senza regex è identificare gli spazi 'veri' da quelli che delimitano le righe differenti.

Spero di essere stato chiaro..:)

Ciao
Franco
Assaggiata l'acqua, conosciuta la sorgente

Cteniza Profilo | Guru

Dovresti allegare il file stesso e non un copia-incolla

utente Profilo | Junior Member

Dai dettagli che hai fornito non vedo tante soluzioni.
L'unica strada che vedo (ma spero di sbagliarmi) funziona solo se conosci a priori la lista degli identificatori di riga e se sai che questo identificatore non si ripete nella riga.
In questo caso dove vedi uno spazio seguito da identificatore e asterisco allora quella è una nuova riga.

franco.geko Profilo | Junior Member

>Dovresti allegare il file stesso e non un copia-incolla

Si hai ragione, scusa
Te li allego :)

Ciao
Franco
Assaggiata l'acqua, conosciuta la sorgente

franco.geko Profilo | Junior Member

>Dai dettagli che hai fornito non vedo tante soluzioni.
>L'unica strada che vedo (ma spero di sbagliarmi) funziona solo
>se conosci a priori la lista degli identificatori di riga e se
>sai che questo identificatore non si ripete nella riga.
>In questo caso dove vedi uno spazio seguito da identificatore
>e asterisco allora quella è una nuova riga.

Eh si, anche se l'identificatore di riga *potrebbe* duplicarsi nel testo stesso..
La lista degli identificatori di riga tra l'altro è molto vasta :(

In realtà lo standard è dato da un file con singole righe ciascuna delle quali con un proprio identificativo.
Quel file (sorgente) in realtà è "errato" ma purtroppo non posso avere di meglio dal fornitore di quei dati...

Grazie
Franco
Assaggiata l'acqua, conosciuta la sorgente

Cteniza Profilo | Guru

Ho guardato, con regex non credo (almeno per me ne sono certo) di essere in grado di sviluppare:
Da quanto ho capito:
Identificatore di 3 caratteri variabili, il quarto è sempre un asterisco, si prende tutto quanto c'è tra un identificatore e l'altro
Personalmente proverei a leggere tutto il file in un colpo poi leggere il tutto a forza di substring

franco.geko Profilo | Junior Member

>Ho guardato, con regex non credo (almeno per me ne sono certo)
>di essere in grado di sviluppare:
>Da quanto ho capito:
>Identificatore di 3 caratteri variabili, il quarto è sempre un
>asterisco, si prende tutto quanto c'è tra un identificatore e
>l'altro
>Personalmente proverei a leggere tutto il file in un colpo poi
>leggere il tutto a forza di substring

Temevo questa risposta :D
E' la stessa conclusione alla quale ero giunto

Grazie dell'aiuto e dell'attenzione
Ciao
Franco
Assaggiata l'acqua, conosciuta la sorgente
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5