07 Febbraio, 2012, 09:53:14 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: I vincitori del Concorso desktop del mese di dicembre sono a pari merito alecive e iacoporosso. L'elenco dei precedenti vincitori è qui.
 
   Indice   FAQ Aiuto Regolamento Ricerca Accedi Registrati  

Wiki
Programmazione   •   Editor di Testo   •   Linguaggio Bash
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [Bash scropt] - alcuni dati di molti file excel (o calc) in uno unico  (Letto 2031 volte)
0 Utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Fed7
Coraggioso Chiacchierone
*
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 493

Media messaggi



Mostra profilo WWW
« inserita: 03 Luglio, 2008, 18:03:17 »

Premessa: si lo so ultimamente non bazzico più da queste parti ...  Cry .... ma ho molto lavoro  Good

Giusto ieri l'altro un cliente a cui avevo preparato un modello calc per le fatture mi chiede se è possibile ottenere una sorta di prima nota .. in modo più o meno automatico.
Le fatture sono circa 170. Quindi 170 file diversi.
Ora non che io sia un guru di office e/o di OOo .... ma cavolo! .. non ho proprio trovato nulla.
A quanto sembra non si può!

Non so come ma lui me li ha salvati tutti in xls  Shocked ... perchè dico io .... cmq ... st. google ci aiuta sempre ed ecco che finisco per trovare una utility in java che si chiama JODConverter (http://artofsolving.com/opensource/jodconverter). Questa converte più o meno tutto in tutto.

Capisco che c'è una sola strada: bash!

Mi metto al lavoro.
Solo un piccolo intoppo (e chiesto aiuto al forum ieri sera) xchè non mi ero accorto che i nomi file avevano degli spazi  Angry

Ok ... l'idea è questa:
- elimino gli spazi
- converto in csv con JODConverter
- estraggo la i dati che mi servono (numero fattura, data, nome, importo) ... da tutti i file (ciclo!!!)
- assemblo un nuovo csv con i dati (idea!! metto in mezzo dei ";" xchè le virgole ci sono già nei decimali dell'importo!!)
- faccio aprire da calc e salvo in xls .. o ods che è meglio

lo script ... udite udite è andato su al primo colpo .. solo un piccolo stop: JODConverter richiede OOo avviato e questo mi occupava un terminale e non mi permetteva la prosecuzione delle operazioni ... è bastato mettere un "&" davanti

eccolo ... testato .. ha fatto il lavoro in pochi istanti:
Codice:
#!/bin/sh
# Script Bash by F3d7
#
# Prima nota: lo scipt converte i file ODS e/o XLS in CSV
# estrae da questi il numero fattura, la data, il nome e l'importo
# li assembla in un nuovo file CSV pronto per CALC
#
# Release 0.0.2
# del 3/7/2008
#
# Enjoy!!!!!!!!!
#
#
# elimino gli spazi dei file
echo "##### Prima Nota 1.0 ####"
echo "by F3d7"
#
echo "Rimuovo gli spazi"
percorso=$PWD
echo "Nome cartella?"
read cartella
cd $percorso"/"$cartella
for nomefile in *
do
mv "$nomefile" $(echo "$nomefile" | tr " " "_")
done
#
echo "Fatto!! Ho rimosso gli spazi dai nomi dei file ;)"
# converto i file xls e/o ods in csv
echo "I file sono XLS o ODS? Digita xls o ods!!!"
read formato
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard& #lancia OOo in background
java -jar /home/fedsette/Download/jodconverter-2.2.1/lib/jodconverter-cli-2.2.1.jar -f csv *.$formato #converte tutti i file in csv
# kill del processo che converte in CSV
var=`ps ax | grep port=8100 | grep -v grep | grep -v etc | awk '{print $1;}'`
kill $var
#
mkdir tmp
mv *.csv ./tmp/
cd tmp
# estraggo le righe che mi interessano
for nomefile2 in *
do
riga_numero=`sed -n '5p;5q' "$nomefile2"` # con sed estraggo la riga
riga_data=`sed -n '9p;9q' "$nomefile2"`
riga_nome=`sed -n '13p;13q' "$nomefile2"`
riga_importo=`sed -n '38p;38q' "$nomefile2"`
#
# estraggo i valori
#
numero_tmp=`expr substr "$riga_numero" 44 10`
data_tmp=`expr substr "$riga_data" 39 10`                           
nome_tmp=`expr substr "$riga_nome" 16 25`                           
importo_tmp=`expr substr "$riga_importo" 22 15`
#
# rimuovo virgolette e altro
#
numero=`echo ${numero_tmp%'"'*','}`
data=`echo ${data_tmp%'"'*','}` #rimuove virgolette e virgola dal fondo
nome=`echo ${nome_tmp%'"'*','}`
importo_pre=`echo ${importo_tmp%'"'*''}`   
#soluzione due per rimuovere le virgolette
importo=`echo ${importo_pre#''*'"'}`                             
# esporto i risultati solo per test
echo $numero
echo $data
echo $nome
echo $importo
riga=$numero';'$data';'$nome';'$importo
echo $riga >> prima_nota.csv
done
echo "File CSV generato"
# apro in OOo
soffice prima_nota.csv
#
#
# End!!!!!

i numeri di riga e colonna ovviamente vanno customizzati per le vs esigenze ..... da "# estraggo le righe che mi interessano" in avanti
Registrato

The Penguin Ice Climber ;-)
crap0101
Audace Accademico
***
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 4.386

Media messaggi


Long Live The New Flesh


Mostra profilo WWW
« Risposta #1 inserita: 03 Luglio, 2008, 21:57:25 »

 Shocked , bravo!
mo me lo segno,... non si sa mai  Grin
Registrato

http://www.gnu.org/    http://boinc.berkeley.edu/    http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Fed7
Coraggioso Chiacchierone
*
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 493

Media messaggi



Mostra profilo WWW
« Risposta #2 inserita: 04 Luglio, 2008, 07:52:32 »

Shocked , bravo!
mo me lo segno,... non si sa mai  Grin

è sicuramente migliorabile .. ma tant'è .. 3 orette di lavoro .. e funge al secondo colpo!!

ad esempio l'estrazione delle righe e poi dei valori può essere "assemblata"  .. ma al momento per avere un maggior controllo degli errori ho preferito così!
Registrato

The Penguin Ice Climber ;-)
Fed7
Coraggioso Chiacchierone
*
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 493

Media messaggi



Mostra profilo WWW
« Risposta #3 inserita: 04 Luglio, 2008, 10:25:58 »

si è vero .. vi sto snobbando xchè seguo altri forum ... ma son forum di montagna ... l'altro mio grande amore Grin

cmq, proprio su uno di questi mi hanno fatto conoscere BUC ... che anche qui è stato trattato ma a me era sfuggito ... così!!!!



ecco il codice mc:
Codice:
<?xml version="1.0"?>
 <config>
   <tab>
     <title>echo "Genera Prima Nota 1.0"</title>
   </tab>
<label>
                echo "Seleziona il percorso"
        </label>
<file var="percorso" mode="dir" filter="">
    </file>
<label>
                echo "Seleziona il tipo di file"
        </label>
<combobox var="formato">
                echo "xls"
                echo "ods"
                </combobox>
<label>
                echo "Clicca su AVVIA per effettuare la conversione"
        </label>
<button title="AVVIA">
direct=echo $PWD
sh primanota.sh $percorso $formato
</button>
  </config>

il codice di primanota.sh:
Codice:
#!/bin/sh
# Script Bash by F3d7
#
# Prima nota: lo scipt converte i file ODS e/o XLS in CSV
# estrae da questi il numero fattura, la data, il nome e l'importo
# li assembla in un nuovo file CSV pronto per CALC
#
# Release 1.0 with BUC
# del 4/7/2008
#
# Enjoy!!!!!!!!!
cd $1
for nomefile in *
do
mv "$nomefile" $(echo "$nomefile" | tr " " "_")
done
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard&
java -jar /home/fedsette/Download/jodconverter-2.2.1/lib/jodconverter-cli-2.2.1.jar -f csv *.$2
processo=`ps ax | grep port=8100 | grep -v grep | grep -v etc | awk '{print $1;}'`
kill $processo

mkdir tmp
mv *.csv ./tmp/
cd tmp
for nomefile2 in *
do
riga_numero=`sed -n '5p;5q' "$nomefile2"`
riga_data=`sed -n '9p;9q' "$nomefile2"`
riga_nome=`sed -n '13p;13q' "$nomefile2"`
riga_importo=`sed -n '38p;38q' "$nomefile2"`
numero_tmp=`expr substr "$riga_numero" 44 10`
data_tmp=`expr substr "$riga_data" 39 10`
nome_tmp=`expr substr "$riga_nome" 16 25`
nome_tmp=`expr substr "$riga_nome" 16 25`
importo_tmp=`expr substr "$riga_importo" 22 15`
numero=`echo ${numero_tmp%'"'*','}`
data=`echo ${data_tmp%'"'*','}`
nome=`echo ${nome_tmp%'"'*','}`
importo_pre=`echo ${importo_tmp%'"'*''}`   
importo=`echo ${importo_pre#''*'"'}`                             
riga=$numero';'$data';'$nome';'$importo
echo $riga >> prima_nota.csv
done
soffice prima_nota.csv

come detto ... piuttosto banale .. ma potente e rapido!!!! BELLO!!! ... purtroppo ... oltre un certo numero di linee .. va in palla .. così ho ovviato appoggiandomi ad un bash ext a cui ho dato in pasto le variabili di buc Wink
« Ultima modifica: 08 Luglio, 2008, 11:28:15 da Fed7 » Registrato

The Penguin Ice Climber ;-)
Pagine: [1]   Vai su
  Stampa  
 
Vai a: