Leggere i file tabellari con Envision - Software di ottimizzazione delle scorte

Leggere i file tabellari con Envision












Home » Risorse » Qui

Envision carica ed elabora i file tabellari archiviati sugli account Lokad. Lokad supporta numerose applicazioni terze: se l'applicazione gestionale in uso nella vostra azienda è supportata da Lokad, ci occuperemo noi di importare i dati creare i file necessari. Tuttavia, se l'applicazione non è supportata, o se non fosse possibile recuperare tutti i dati necessari, è comunque possibile importare i dati manualmente. In questa pagina vedremo come formattare i file per renderli compatibili con Envision e scopriremo come i file tabellari vengono letti dal sistema.


In breve

I formati di file supportati da Lokad sono:

  • File CSV, TSV e altri file flat di testo usati comunemente, file .csv, .tsv o .txt.
  • File Microsoft Excel 2007 e superiori, file .xlsx.
  • Archivi GZip, file .gz; il contenuto dovrà essere un file flat.
  • Archivi WinZip, file .zip; l'archivio dovrà contenere 1 solo file, che dovrà essere un file flat.
  • Archivi 7z, file .7z; l'archivio dovrà contenere 1 solo file, che dovrà essere un file flat.

La sintassi per la lettura dei file in Envision è la seguente:
read "/foo/myorders.csv.gz" as Orders with "My Id" as Id, Quantity : number
read "/foo/promos*.xlsx" as Promos[*] // l'asterisco * indica che verranno letti più file
read max "/foo/stocks*.xlsx" as Stocks[*] // max all'interno del carattere '*', per leggere un solo file
read "/foo/backorders.tsv.zip" unsafe as Backorders[Date, *] // 'unsafe' tollera problemi a livello di analisi

Archiviazione dei file e connettori

Ogni account Lokad ha un proprio servizio di archiviazione dei file. In parole semplici, ciò significa che è possibile creare cartelle e caricare file al loro interno. A questo proposito, Lokad offre un servizio di file hosting simile a quello di Box o Dropbox, ma con funzionalità di condivisione dei file molto più limitate: questo perché il nostro intento non è quello di fornire un'applicazione per la condivisione dei file, ma di garantire accesso completo a tutti i dati che usiamo nell'analisi della vostra attività commerciale. Quando viene generata una previsione o un pannello di controllo con Lokad, quindi, i dati corrispondenti saranno presenti all'interno dell'account, da cui voi potrete scaricarli, e noi potremo analizzarli, in modo totalmente autonomo.

Per le imprese più piccole, produrre file che contengano tutti i dati rilevanti può essere un'operazione lunga e difficile, perché spesso le risorse informatiche non sono altrettanto potenti di quelle di una grande azienda. Per questo, Lokad integra nella sua tecnologia una serie di connettori per le applicazioni gestionali più comuni (per citarne alcune, Brightpearl, Linnworks, QuickBooks, TradeGecko, Unleashed, Vend…): i connettori consentono di connettersi, appunto, alle applicazioni, di solito tramite un'API (Application Programming Interface), e di generare, all'interno dell'account Lokad, dei file formattati direttamente nel modo più adatto all'elaborazione con Envision.

Se l'applicazione gestionale utilizzata non è supportata (in questo caso vi invitiamo a e richiedere di aggiungerla, faremo il possibile per supportare le applicazioni più richieste), o se le integrazioni di Lokad non sono in grado di coprire tutti i dati rilevanti, è possibile caricare i file direttamente sull'account, manualmente e attraverso il web. Tuttavia, i dati dovranno essere aggiornati spesso, per cui il trasferimento automatico dei file è senz'altro preferibile. Per questo Lokad supporta i protocolli FTP e SFTP, che consentono di trasferire file in modo completamente automatizzato.

Una vasta gamma di file tabellari

Lokad supporta una vasta gamma di formati di file che possono contenere dati tabellari, primi fra tutti i più popolari Excel e CSV (comma-separated value). Chi ha esperienza con l'importazione e l'esportazione di file flat saprà già che nelle procedure di questo tipo i dettagli tecnici sono fondamentali, altrimenti si rischiano i problemi più diversi:

  • la codifica del file potrebbe essere diversa dalla codifica prevista dall'applicazione;
  • date e numeri potrebbero essere formattati in modo diverso da quello previsto;
  • la codifica del delimitatore di colonna o del ritorno a capo potrebbe essere diversa.

Il nostro sistema è stato progettato nel preciso intento di riconoscere automaticamente tutti questi dettagli (codifica, formato di date e numeri, delimitatori…). Nonostante il procedimento sia completamente automatizzato, la lettura dei file tramite il nostro sistema è pur sempre molto complessa. Per esempio, abbiamo deciso di supportare ora il riconoscimento automatico di oltre 100 diversi formati di data.

Le linee guida per l'uso dei file tabellari sono semplici: i nomi delle colonne devono essere indicati nella prima riga del file (proprio come nei fogli Excel); quando, poi, usiamo file flat di testo come CSV o TSV, dobbiamo assicurarci che i valori non siano in conflitto con i delimitatori.

Man mano che i file flat aumentano di dimensione, è più pratico comprimerli, prima di caricarli in Lokad. Lokad supporta file flat di testo compressi con GZip se alla fine del nome del file viene aggiunta l'estensione .gz. Ad esempio, Lokad_Items.tsv.gz viene riconosciuto come file TSV compresso con GZip. Lo stesso vale per gli archivi WinZip con estensione .zip e gli archivi 7z con estensione .7z. Per WinZip e 7z, gli archivi dovranno contenere un solo file compresso, dal momento che Envision non supporta gli archivi a file multipli. I fogli Excel sono già compressi, dunque non c'è alcun bisogno di comprimerli ulteriormente, anche se sono di dimensioni considerevoli.

Nominare file e colonne: le nostre linee guida

Lokad è in grado di gestire quasi ogni nome di file o colonna, ma, se vengono seguite alcune linee guida, lo script Envision sarà sicuramente più semplice. Il nostro set di dati campione è un buon esempio di file che seguono queste linee guida. A chi non ha ancora dato un'occhiata al campione, suggeriamo di farlo adesso.

I file dovrebbero essere nominati seguendo queste indicazioni: prendendo a modello Lokad_TableName.xyz, TableName dovrà essere sostituito dal nome della tabella e xyz dall'estensione del file (ad esempio, xlsx per i fogli Excel). Il nome della tabella non deve contenere spazi, né iniziare con un numero. Se si seguono queste regole, Envision sarà in grado di riconoscere automaticamente le tabelle da caricare, senza alcun ulteriore sforzo da parte vostra.

La tabella degli articoli è un caso a parte: nella maggioranza delle situazioni, avere una tabella degli articoli intorno alla quale strutturare lo script Envision è di enorme beneficio. Tuttavia, la tabella degli articoli non è indispensabile ed Envision è perfettamente in grado di funzionare anche senza. Se però viene caricato un file nominato Lokad_Items.xyz, questo verrà considerato di default come tabella degli articoli.

Se una tabella è divisa tra diversi file, magari perché un unico file sarebbe troppo grande, Envision può riunire tutti i file in un'unica tabella: basta nominare tutti i file Lokad_TableName_Suffix.xyz, dove Suffix varia da un file all'altro. Per fare un esempio, se sono prodotti degli estratti giornalieri delle vendite, è possibile nominare uno degli estratti Lokad_Orders_2015-03-16.tsv. Suffix serve semplicemente a distinguere i file gli uni dagli altri. Naturalmente, Envision si aspetta di trovare le stesse colonne in tutti i file che hanno lo stesso nome (con la sola differenza del suffisso), altrimenti non potrebbe riunire tutti i file in un'unica tabella senza ulteriori istruzioni.

Il nome delle colonne non richiede accortezze particolari. Envision ha tuttavia alcuni comportamenti predefiniti:
  • se in un file flat viene trovata una colonna Id, quest'ultima fungerà da chiave esterna alla colonna Id trovata nel file Lokad_Items.xyz;
  • se il nome di una colonna termina per Date, Envision considererà la colonna come data.

È possibile assegnare alle colonne un nome qualsiasi, purché non contenga spazi e non inizi con un numero.

Anche se queste regole non vengono rispettate (se ad esempio troviamo uno spazio nel nome di una colonna o di una tabella), Envision fornisce comunque i mezzi per gestire la situazione. Consigliamo, però, di seguire queste raccomandazioni per quanto possibile, poiché così lo script necessario a produrre i primi risultati sarà molto più breve.

Sintassi per la lettura dei file

Envision dispone di una ricca sintassi per la lettura dei file, in grado di gestire le situazioni in cui le linee guida per la denominazione dei file non possono essere seguite (ossia, quando i file non possono essere modificati internamente). In questa sezione vedremo la sintassi a grandi linee, mentre discuteremo più avanti dei dettagli.
read "/foo/bar*.xyz" as MyTable with "Foo1" as Id, "Foo2" as Date, "Foo 3" as Foo3
Il percorso /foo/bar*.xyz potrebbe contenere un carattere jolly (*), che può essere sostituito da una sequenza di caratteri. L'uso del carattere jolly è facoltativo, ma offre la possibilità di catturare più file alla volta. Si tratta di un modello simile alla sintassi della shell usata per elencare file dalla riga di comando.

La prima parola chiave, as, che troviamo subito dopo il percorso, indica il nome della tabella. Se il nome della tabella è MyTable, allora lo script Envision si riferirà a questa tabella scrivendo ad esempio MyTable.Id. Se si vuole caricare la tabella degli articoli, si può saltare as MyTable.

Le istruzioni dopo with servono a rinominare le colonne. Nell'esempio sopra, la colonna Foo1 è rinominata Id, mentre la colonna Foo2 è rinominata Date. Rinominando le colonne, la tabella MyTable diventa una vera e propria tabella Envision contenente dati storici, poiché le colonne Id e Date sono definite correttamente.

Ora, la colonna Foo 3 (da notare lo spazio nel nome della colonna) viene rinominata Foo3. Questo è un esempio di come un nome non corretto viene trasformato in un nome corretto. Ricordiamo che anche il nome delle variabili vettore non può contenere spazi. Per concisione, non abbiamo incluso altri esempi di file rinominati, ma, per ogni file, le coppie di nomi modificati possono anche essere molto numerose. Riassumendo, rinominare una colonna è utile a rendere lo script più leggibile, ma anche a riunire più file in una sola tabella quando i nomi delle colonne variano da un file all'altro.

Vediamo ora un esempio pratico. Poniamo che lo storico delle vendite sia diviso in due file. Il primo file, Lokad_Orders_Old.tsv, contiene tutti i dati fino al 31 dicembre 2014, suddivisi in tre colonne: ItemId (nome dell'articolo), OrderDate (data dell'ordine) e Quantity (quantità). I nomi delle colonne, quindi, non rispettano le linee guida di Envision. Il secondo file, Lokad_Orders.tsv, è più recente e contiene i dati storici a partire dal 1° gennaio 2015. Anche questo secondo file contiene tre colonne: Id, Date e Quantity, il cui nome rispetta le convenzioni Envision. Nello script qui sotto vediamo come i due file possono essere riuniti in una sola tabella Orders.
read "/foo/Lokad_Orders_Old.tsv" as Orders with "ItemId" as "Id", "OrderDate" as Date
read "/foo/Lokad_Orders.tsv" as Orders
Naturalmente, è possibile definire tante istruzioni read quante ne sono necessarie per coprire tutti i file e tutte le tabelle. Envision non impone di inserire queste istruzioni in una posizione precisa, quindi, teoricamente, è possibile inserirle in un punto qualsiasi dello script, anche alla fine. Consigliamo però di inserirle all'inizio dello script, perché questa è la posizione che di solito viene loro assegnata dai programmatori.

Filtri con caratteri jolly

Il carattere jolly (*) offre la possibilità di selezionare più file. A volte, però, abbiamo bisogno di leggere un solo file tra tanti. Se vogliamo leggere solo "l'ultimo" di una serie di file ordinati per nome, possiamo fare così:
read max "/foo/bar*.xyz" as MyTable with "Foo1" as Id, "Foo2" as Date, "Foo 3" as Foo3

I filtri con carattere jolly sono 3:

  • min: mostra il primo file se i file sono ordinati per nome (ordine lessicografico);
  • max: mostra l'ultimo file se i file sono ordinati per nome (ordine lessicografico);
  • latest (più recente): mostra l'ultimo file se i file sono ordinati per data di ultima modifica.

Ad esempio, se ogni giorno carichiamo in Lokad uno snapshot dei livelli di scorte attraverso un file denominato stocks-2016-12-21.csv, con il suffisso che viene di volta in volta modificato per indicare la data, allora, molto probabilmente, ci interesserà solo il file più recente. In questo caso specifico, sia max sia latest ci darebbero lo stesso risultato, perché le convenzioni per la denominazione dei file corrispondono alle date di aggiornamento.

Definire i tipi che il sistema deve aspettarsi

Envision, se non diversamente specificato, si aspetta che ogni tabella (a eccezione della tabella degli articoli) contenga due colonne, Id e Date, ottenibile rinominando le colonne seguendo i passi indicati nella sezione precedente. Non è detto, però, che la tabella corrisponda alle aspettative: in questo caso, la sintassi di Envision potrà essere usata per chiarire le aspettative associate alla tabella. Anche il tipo di colonna può essere dedotto dallo script Envision; a volte, però, ciò non è sufficiente. Anche in questo caso, la sintassi di Envision offre la possibilità di specificare qualsiasi tipo di colonna necessario.

Envision offre la possibilità di definire le chiavi primarie di una tabella elencandole tra parentesi subito dopo la definizione. Sono permesse solo sette combinazioni di chiavi primarie:
read "a.csv" as A[*]
read "b.csv" as B[Id]
read "c.csv" as C[Id, *]
read "d.csv" as D[Date]
read "e.csv" as E[Date, *]
read "f.csv" as F[Id, Date]
read "g.csv" as G[Id, Date, *]
A[*] definisce una tabella senza alcuna indicazione particolare: è una sorta di jolly, che si adatta agli scenari più diversi. Se, però, manca la colonna Id, si rischia di perdere alcune delle funzionalità più interessanti di Envision.

B[Id] definisce una tabella di una riga per articolo al massimo. Un esempio sono le impostazioni per la gestione del magazzino.

C[Id, *] definisce una tabella con un qualsiasi numero di righe per articolo. Un esempio sono le nostre tabelle per la distribuzione di probabilità.

D[Date] definisce una tabella che contiene un singolo valore scalare per alcuni giorni. Una tabella come questa può essere usata per elencare le feste nazionali applicabili a una certa zona geografica.

E[Date, *] definisce una tabella che contiene un numero qualsiasi di valori scalari per alcuni giorni. Si tratta di un'estensione del caso precedente, in cui un solo giorno può essere associato a più fattori.

F[Id, Date] definisce una tabella che contiene al massimo un valore per ogni combinazione [Id, Date]. Una tabella come questa può essere utile a elencare le rotture di stock avvenute in passato.

G[Id, Date, *] indica il comportamento predefinito, che si otterrebbe omettendo le parentesi. La maggioranza dei dati storici, in primis lo storico delle vendite, seguono questo schema.

Vincoli di tipo per le colonne

Envision, poi, è un linguaggio a tipizzazione forte. Ciò vuol dire che tutti i vettori sono associati a uno dei 4 tipi disponibili in Envision: testo (text), numero (number), data (date) e booleano (boolean). I tipi vengono generalmente dedotti dallo script, ma possono anche essere specificati con la sintassi:
read "a.csv" as A[*] with "Foo" as X : text, Y : number, Z : date
Se poi torniamo al nostro campione dati e scriviamo:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_Orders.tsv" as Orders
read "/sample/Lokad_PurchaseOrders.tsv" as PO
// queste prime tre righe saranno omesse in seguito
Quantity = sum(Orders.Quantity)
il vettore Orders.Quantity è implicitamente tipizzato come numero, poiché solo i numeri possono essere sommati (sum). Di conseguenza, quando Envision analizza il file Lokad_Orders.tsv, si aspetta che la colonna Quantity contenga valori che possono essere analizzati come numeri. Se provassimo a scrivere:
Nonsense = sum(Orders.Client)
Envision cercherebbe di analizzare la colonna Client (cliente) del file Lokad_Orders.tsv con dei numeri. Il procedimento, ovviamente, fallirebbe, poiché la colonna non contiene numeri. Oltre al meccanismo di inferenza, Envision offre una sintassi che specifica esplicitamente il tipo che il sistema deve aspettarsi da ogni colonna di ogni tabella. Il nostro campione dati può essere tipizzato esplicitamente con queste istruzioni:
expect Supplier : text
expect Orders.NetAmount : number
expect PO.ArrivalDate : date
La sintassi segue il modello expect MyTable.MyColumn : type, in cui type (tipo) è uno dei quattro tipi disponibili: text (testo), number (numero), date (data) o boolean (booleano). Il più usato è date, dal momento che non è sempre possibile concludere che una colonna contiene date solo sulla base di operazioni aritmetiche e inferenza.

Opzioni di parsing

La funzionalità di parsing all'interno di Envision è piuttosto tollerante, ma in alcuni casi potrebbe aver bisogno di un aiuto esterno. A tal proposito, l'opzione skip (salta) può essere usata per ignorare le prime N righe del file flat. La sintassi è la seguente:
read "/foo/bar*.csv" skip:2 as MyTable with "Foo1" as Id, "Foo2" as Date
Nell'esempio sopra, vengono saltate le prime due righe del file flat, per cui l'intestazione delle colonne dovrà essere alla terza riga. L'opzione skip è facoltativa e il suo valore predefinito è skip:0. Può però rivelarsi utile quando si ha a che fare con sistemi che introducono metadati all'inizio delle estrazioni da file flat.

Come gestire eventuali errori di lettura

Per impostazione predefinita, l'analisi che Envision conduce sui file è rigorosa: se Envision si aspetta che un valore sia una data o un numero, ma il valore non viene correttamente analizzato come tale, l'istruzione read fallisce e dà errore come risultato. In genere, se Envision incontra errori di lettura, la soluzione migliore consiste nel capire prima di tutto perché il file è corrotto: infatti, dato che Envision è in grado di riconoscere numerosi formati di date e numeri, è altamente probabile che la causa dell'errore sia da ricercare nel file. Un file contenente dati corrotti può causare errori di varia natura: nei rari casi in cui Envision fallisce, significa che esiste un problema a monte.

Tuttavia, specialmente con i set di dati più grandi, diventa molto più difficile evitare gli errori minimi. Soprattutto se questi risalgono a periodi meno recenti, poi, potrebbe non valere neanche la pena di sistemarli. Proprio per ovviare a questi problemi, Envision supporta una particolare modalità di lettura unsafe (non sicuro), illustrata dalla sintassi qui sotto:
read "/foo/orders.tsv" unsafe with "My Id" as Id, "My Date" as Date
Quando è attiva la modalità unsafe, Envision percepisce le analisi problematiche come avvertimenti, invece che come veri e propri errori. L'opzione consente quindi di proseguire i calcoli anche se i valori o le righe sono stati esclusi dall'analisi perché illeggibili.