giovedì 10 aprile 2008

Riordinamento delle celle di un file CSV

Quando si esportano/importano dati con file CSV può essere comodo rigirare le celle di una medesima riga ordinandole. Il riordinamento ovviamente ha senso se le celle rappresentano la stessa caratteristica, ossia appartengono alle stessa categoria (es. attributi di classificazione). Il seguente script è un semplice esempio di come ottenere il riordinamento di un file CSV:

#!/usr/bin/perl

# Script per ordinare la riga di un file csv. Accetta in ingresso il file di uscita e stampa su
# STDOUT le righe riordinate.

# * Copyright (C) Luca Ferrari 2008
# *
# * This program is free software: you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation, either version 3 of the License, or
# * (at your option) any later version.
# *
# * This program is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# * GNU General Public License for more details.
# *
# * You should have received a copy of the GNU General Public License
# * along with this program. If not, see .


$INPUT_FIELD_SEPARATOR = ";";

open(FILE_IN, "<$ARGV[0]") || die("\nImpossibile aprire il file di input $ARGV[0]\n$!\n");

while( $line = ){
$line =~ s/\r\n//;
$line =~ s/\n//;
@parts = split(";", $line);


foreach $element (sort (@parts)){
print "$element;";
}

print "\n";
}



Come si può notare lo script è molto semplice: come primo argomento viene specificato il file CSV da leggere, e ogni riga viene riportata ordinata su standard output (quindi è necessaria la redirezione per l'utilizzo). Da notare che vengono utilizzate due espressioni regolari per la cancellazione dei caratteri di andata a capo; questo è dovuto ad un problema di chomp qualora il file di origine sia stato generato da un computer Microsoft Windows. In questo caso, infatti ogni riga viene terminata da una sequena \r\n, della quale chomp rimuove solo l'ultimo \n. Ne consegue che rimane un ritorno di carrello (\r) che produce sovrascritture dei campi di uscita. La prima espressione regolare verrà utilizzata nel caso di file di origine prodotti da Microsoft Windows, mentre la seconda nel caso di un file prodotto su piattaforma Unix.

Nessun commento: