<< Back

Gestire file testo a dimensione fissa con Alteryx

Vi capita di avere a che fare quotidianamente con file di testo a dimensione fissa, composti da un’unica lunghissima stringa di testo tutta attaccata, in cui ogni colonna è composta da un numero fisso di caratteri?

Ad esempio abbiamo un file di testo del genere:

dimensione fissa

Un’unica stringa lunga 4002 caratteri.

Di questi 4002 caratteri, i primi 3 rappresentano l’ID di riga, i successivi 15 sono l’ID dell’ordine, gli 8 dopo sono la data e i successivi 14 sono il tipo di spedizione.

dimensione fissa

Ogni colonna ha una sua dimensione fissa e ogni 40 caratteri (3+15+8+14) inizia di fatto una nuova di riga di dato.

Dobbiamo trovare un modo per spezzettare questa lunga stringa in N righe, 1 ogni 40 caratteri e, una volta fatto questo, suddividere ulteriormente ogni riga nelle 4 colonne di cui è composta.

Complicato? Già iniziate a sudare freddo a pensare alla marea di funzioni “Substring” che dovrete scrivere per estrarre i caratteri che vanno da 1 a 3, e poi da 3+1 a 15+3, ecc, ecc…?

E se vi dicessi che ce la possiamo cavare con al massimo 2 tools e una manciata di istruzioni?

Vediamo come fare!

Utilizzare come input formati non supportati

Prima di tutto dobbiamo aprire il nostro file – che di solito non è in formato .txt, bensì in formati con estensioni pressoché sconosciute a Windows, ma che possono essere aperti come testi perché di fatto lo sono – in Alteryx, fingendo che sia un file di testo.

Per questo esempio useremo un file con estensione .chicca, potete scaricarlo da qua.

Trasciniamo nell’area di lavoro un Input Tool e andiamo a cercare il file:

input tool

Dato che stiamo aprendo un file con un formato sconosciuto, dobbiamo selezionare nel menù a tendina “Tipo di file” la voce “All files”. Ora potremo vedere il file con estensione .chicca e aprilo.

Alteryx ci mostrerà una finestra di prompt in cui ci chiederà come vogliamo aprire il file, non essendo uno dei formati supportati:

apri come

Leggiamolo come un file di testo delimitato, senza alcun carattere delimitatore e deselezioniamo l’opzione dei titoli di colonna nella prima riga.

Se proviamo a mandare in esecuzione il workflow (CTRL+R), un messaggio di warning ci dirà che il record #1 è stato troncato:

warning

Questo succede perché di default Alteryx setta come dimensione della colonna il valore di 254, che è lo standard per le stringhe di testo. Nel nostro caso la stringa è molto più lunga, perché è unica. Dobbiamo aumentare la lunghezza del campo:

input proprietà

Mettiamo un valore anche esageratamente alto, avremo occasione più avanti per riportarlo a valori più idonei.

Suddividere il testo in righe

Abbiamo detto che ogni 40 caratteri inizia una nuova riga. Dobbiamo trovare un modo per stabilire dove sono questi 40 caratteri.

Potremmo calcolare la lunghezza totale della stringa (4000) dividerla per 40 e scoprire che abbiamo 100 righe. Trovare le sottostringhe che vanno da 0 al 40esimo carattere, poi dal 41esimo all’80esimo, ecc, ecc… così avanti per ogni multiplo di 40 fino a raggiungere 4000… mi sta già fumando il cervello!

In realtà ci basta sapere che ogni riga è composta da 40 caratteri. Indipendentemente da cosa ci sia scritto dentro, se la stringa finisca con uno spazio o con un numero o con una lettera… sappiamo che sono 40 caratteri. È un pattern che si può usare con il RegEx Tool, con le espressioni regolari e la modalità “Tokenize”:

regex

  • Field to Parse: l’unica colonna che abbiamo e che si chiama “Field_1”
  • Regular expression: .{40}, ossia un qualsiasi carattere che si ripete 40 volte, una sequenza di 40 caratteri.
  • Output Method: Tokenize, il pattern che abbiamo descritto verrà splittato in elementi separati
  • Properties: Split to rows, verrànno create n righe che contengono il pattern descritto nell’espressione regolare.

Quindi stiamo creando (4000/40) 100 righe che contengono 40 caratteri l’una:

Suddividere le righe in colonne

Ora che abbiamo individuato le righe, non ci resta che suddividerle in colonne.

Se avessimo un qualche carattere delimitatore potremmo usare un Text to Columns… ma non ne abbiamo. Ancora una volta sappiamo solo la dimensione fissa di ogni colonna.

Possiamo sfruttare ancora le espressioni regolari, questa volta però con il metodo “Parse” che permette di estrarre i pezzi di testo che ci interessano e creare delle colonne:

  • Field to Parse: la colonna “Field_1”
  • Regular expression: .{3}.{15}.{8}.{14}
  • Output Method: “Parse”

Ok, e ora come facciamo a far capire al RegEx Tool che vogliamo creare 4 colonne? Dobbiamo racchiudere le porzioni di espressione regolare tra parentesi tonde:

Se ora racchiudiamo tra parentesi anche il secondo pezzo (.{15}), avremo questo risultato:

Quando avremo finito di racchiudere tra parentesi tonde tutti i pezzi che ci interessano, il tool in basso avrà creato 4 nuovi campi/colonne che si chiamano di default “RegExOut1”, “RegExOut2”, ecc, ecc… e che possono essere rinominati all’interno del tool stesso, con un semplice doppio clic sul nome:

Stessa cosa vale per la lunghezza del campo. Possiamo fare doppio clic sulla scritta “2540000” – che era la dimensione esageratamente grossa impostata all’inizio – e settare un valore più consono. Oppure lasciare tutto com’è e utilizzare successivamente un Autofield Tool, che imposterà in automatico la dimensione.

Se ora mandiamo in esecuzione il workflow, potremo ammirare il risultato finale:

Rapido e indolore!

Federica Ferrarini

Trainer - Milano

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.