Articolo pubblicato sul n. 85 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel maggio 1989

MCmicrocomputer


Software Amiga:
Cut & Paste file

di Andrea de Prisco

Nell'attesa e, perche' no, nella speranza di ricevere programmi dei lettori non piu' chilometrici ma adatti alla pubblicazione in questa rubrica, questo mese il Copertina del numero di MCmicrocomputer contenente l'articolosoftware Amiga e' composto da tre (mie) piccole utility file oriented, da tenere nella propria directory comandi.

 

Avete presente un bel paio di forbici e un vasetto di colla? I  programmi presentati questo mese fanno proprio lo stesso servizio: taglia e incolla. Ovviamente non carta, stoffa o... capelli, ma file. Il primo dei due, Cut, prende un file ed effettua su questo ben due tagli, orizzontali o verticali prelevando quindi solo la parte centrale. I tagli orizzontali sono facilmente "immaginabili": infatti un file di testo e' formato da una sequenza di righe (sequenze di caratteri terminate da un NewLine), quindi tagliare vuol dire selezionare la porzione di testo a partire da una determinata riga fino ad un'altra. In senso verticale i tagli possono essere effettuati solo su file di forma tabellare, come quelli ottenuti da uno spreadsheet o da un data base: in questo secondo caso la selezione avverra' per colonne, ad esempio dalla 34-esima alla 128-esima.

La sintassi di questo comando e' quanto mai semplice:

 

cut v|h sorgente destinazione start stop

 

Il primo parametro 'v' oppure 'h' (significato del "v|h") indica appunto se desideriamo un taglio verticale o orizzontale. Segue il nome del file da tagliare e un nome da dare al nuovo file "tagliato". Infine start e stop sono due interi che delimitano la porzione da conservare. Ovviamente sorgente e destinazione possono anche essere lo stesso file, ma attenzione che in questo modo se commettete un errore non potrete piu' tornare indietro.

Facciamo un esempio. Immaginiamo di avere un file di testoformato da 143 linee e decidiamo di togliere le prime e le utime venti di queste. Il file si chiama, tanto per cambiare, pippo e al nuovo file daremo nome "pippo2". Il comando sara':

 

cut h pippo pippo2 21 123

 

ovvero effettuiamo un taglio orizzontale (h) sul file pippo ottenendo il file pippo2 che contiene le linee dalla 21 alla 123 del file d'origine. Ovviamente tanto il parametro "start" quanto il parametro "stop" possono coincidere con la prima o l'ultima linea (colonna) del file sorgente, in modo da effettuare un taglio unilaterale.

Per facilitare l'operazione con file di testo dove non si conoscono a priori le posizioni (numeriche) delle linee, ho approntato una "utility dell'utility", di nome Lines, che permette appunto la visualizzazione numerata delle linee del file sorgente prima di dare di piglio alle forbici (programma Cut). Anche questa, come gli altri due programmi, e' scritta in linguaggio C ed e' stata compilata col Lattice C 4.0 "liscio" ovvero un banale LC -L dei file sorgenti.

Per quanto riguarda invece i tagli verticali, come gia' detto, e' necessario che il file sorgente abbia una forma tabellare, ovvero formato da righe di uguale lunghezza (anche queste termiate da un NewLine) o perlomeno di lunghezza tutte maggiore del taglio da effettuare. La sintassi e' la stessa del caso precedente, con la sola banale differenza del primo parametro 'v' in luogo di 'h'.

 

Usiamo la colla

 

Il secondo programma, come detto, serve per "incollare". Attenzione: non in senso longitudinale (questa funzione e' gia' offerta dal comando di sistema Join) ma in senso "trasversale". Nel senso che, prese due tabelle anche non di pari lunghezza, il file ottenuto sara' formato dalla prima tabella "affiancata" dalla seconda. Ovvero ogni riga del file destinazione sara' formata da una riga del primo file sorgente e una riga del secondo e cosi' via, fino a quando non abbiamo appaiato tutte le righe. Se un file "finisce prima" ovvero contiene un numero inferiore di righe non provoca alcun problema particolare: il programma infatti continua copiando le rimanenti linee del file piu' lungo.

In pratica questo comando Paste permette di saldare assieme varie fette di file ottenute dal Cut verticale, per ottenere nuovi file con tutti i campi che desideriamo escludendo quelli ai quali non siamo interessati. La sintassi e' quanto mai semplice:

 

Paste File1 File2 Dest

 

dove File1 e File2 sono i file da incollare e Dest e' il nome che daremo al file creato.

 

Note tecniche

 

La struttura del programma Cut e' simile a quella del programma Replace presentato sul numero scorso. Per lavorare velocemente il file indicato come sorgente (ovvero quello da "tagliare") e' dapprima caricato in memoria allocando uno opportuno spazio attraverso la funzione AllocMem. Per conoscere la quantita' di spazio atta a contenere in memoria il file, facciamo uso della funzione Examine, una volta eseguita la Lock sul file in questione. Di tutto questo e' stato ampiamemte trattato nella rubrica "Programmare in C su Amiga" di Dario de Judicibus, alla quale vi rimandiamo per maggiore conoscenza. Ovviamente il programma Cut e' diviso in due parti, che sono eseguite (in maniera mutuamente esclusiva) a seconda che intendiamo effettuare un taglio verticale o orizzontale. Le eventuali eccezione sono manipolate dalla gia' utilizzata funzione Abort che, prima di far terminare anzitempo il programma, chiude e libera tutto cio' che e' rimasto aperto o occupato (file e memoria).

Il programma Paste, di contro, esegue le sue operazioni "al volo", senza cioe' caricare in memoria i file da incollare. Mantiene ovviamente aperti contemporaneamente in lettura i file sorgenti e man mano che legge dall'uno o dall'altro file, scarica nel file destinazione. Non vi nascondo che questo "ballo dei due file" mi ha fatto tribolare non poco dovendo tenere sotto controllo contemporaneamente ben due buffer di ingresso, un buffer d'uscita e il flusso dei dati veri e propri. Adesso "pare" che funzioni. Scherzo, naturalmente...

 


Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui