Consenso all'uso dei cookies

SITO1 -- SITO2 -- Forum2 -- CercaGlobale -- Informativa su Cookie e Privacy

Questo Forum1 è in sola lettura -- Usa il Forum2


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Da .xml a spreadsheet
#1
È abbastanza frequente trovarsi a avere esportato/backuppato/salvato un qualche filone di contenuti il quale ci è stato scodellato in formato .xml.
Grande cosa il .xml, a condizione di avere pronto un qualche script per reintegrarlo ma se qualcuno volesse estrapolarsi solo un minimo di informazioni da ogni inserimento?

Questo è lo script che mi sono fatto per buttare dentro a un foglio di calcolo gli sms backuppati in blocco dal telefonino.
Ovviamente, modificandolo opportunamente, lo script è valido per qualsiasi file .xml si abbia.
Bisognerà correggere il numero e le cifre dei campi gestiti da awk (separati da '<') il quale in questo caso rende (separati da un TAB) per ogni riga:
- Il nome o (se non è registrato in rubrica) il numero dell'interlocutore
- Il codice per messaggi in entrata o in uscita
- La data
- L'ora (entrambe recuperate dal timestamp)
- Il testo del messaggio

Non mi è riuscito:
1- Mettere tutti i sed in un comando solo (e da qui il rimbalzo fra $L1 e $L2)
2- Correggere quel cavolo di accapo windows (non che faccia tanto danno in questo caso però potrebbe farlo in altre situazioni).
Quindi ci sono margini di miglioramento per chiunque abbia voglia di guardarci.

Ovviamente lo script si avvia passandogli il nome del file da processare dopo essersi spostati nella sua directory. Es:
/percorso/script.sh/ file.xml

Codice:
#!/bin/bash

zenity --question --title="REMEMBER" --text " ATTENZIONE! \n\n Un'andata a capo dos all'interno degli sms non verrà evitata e genererà una riga fasulla.\n\n Continuare?";
rc=$?
if [ "${rc}" == "1" ]; then
echo “Programma terminato”
exit 1
fi
echo “Procedo”

cp $1 $1.bkp

L1=lab
L2=output.xls

sed 's/\n//g' $1 > $L1
sed 's/<SMS>/\n<SMS>/g' $L1 > $L2
sed 's/>/</g' $L2 > $L1
sed 's/\!\[CDATA\[//g' $L1 > $L2
sed 's/\]\]//g' $L2 > $L1

awk -F "<" '{print $37"\t",$33"\t",strftime("%d-%m-%Y\t%T",$15/1000)"\t",$10}' $L1 > $L2

rm $L1

exit
[Immagine: http://pclinuxos.com/forum/avatars/Pengu...guitux.png] Parole !
Mai che se ne trovino due uguali !
Cita messaggio
#2
Devo dire che un successo così non me lo sarei aspettato!
A ora 255 viste di questo post senza neanche non dico un suggerimento ma neanche una critica, che so, uno sberleffo, una pernacchia...

Vabbè, nella mia notevole generosità e filantropia non mi faccio impressionare e anzi vi do un altro pezzo di lavoro che altro non è che la traccia di qui sopra solo un po' migliorata.

Pronti?
Codice:
#!/bin/bash

# Per formare la stringa di awk usare il comando:
# -----------------------------------------------
# awk -F "<" -v CAMPO=$TAG '{ for(i = 0; i<=NF; i++); if ($i == CAMPO); r=i+1; print "Il campo del tag `"CAMPO"` è il numero " r ; fi }' $FILERECORD
# dove $FILERECORD sarà un file di testo che conterrà un qualsiasi record del .xml in cui i separatori saranno già stati sistemati con le sostituzioni sotto elencate
# dove $TAG è il tag che precede il campo di cui si sta cercando il numero
# -----------------------------------------------

# NOTA ! ! !
# Nel caso di questi sms ogni record comincia con il campo SMS che quindi ho usato come separatore dei record

zenity --question --title="REMEMBER" --text " ATTENZIONE! \n\n Script per sms del gestore XXX salvati su XXXXn con Android x.x \n\n  Lo script potrebbe essere settato per l'esclusione di alcuni record. Continuare?\n\nNB: Tipo messaggio: 1 ricevuto / 2 inviato / 3-4 bozza o altro";

rc=$?
if [ "${rc}" == "1" ]; then
echo “Programma terminato”
exit 1
fi
echo “Procedo”

cp $1 $1.bkp

L1=lab
L2=output.xls

tr -d '\r\n' < $1 > $L1
sed 's/</>/g' $L1 > $L2
sed 's/>>/>/g' $L2 > $L1
sed 's/\!\[CDATA\[//g' $L1 > $L2
sed 's/\]\]//g' $L2 > $L1

awk -v RS=">SMS" -v ORS="\n" -F ">" '{print $25"\t",$22"\t",strftime("%d-%m-%Y\t%T",$9/1000)"\t",$6}' $L1 > $L2

# ----------------------
# variante con filtri
# ----------------------
#awk -F ">"  '$25!="UTENTE" && $22=="2" {print $25"\t",$22"\t",strftime("%d-%m-%Y\t%T",$9/1000)"\t",$6}' $L1 > $L2
#sort -u $L2 >  $L1
#cat $L1 > $L2
# ----------------------

rm $L1

exit
Siete contenti?
Resto pronto a ricevere i segni entusiastici della vostra gratitudine imperitura.
[Immagine: http://pclinuxos.com/forum/avatars/Pengu...guitux.png] Parole !
Mai che se ne trovino due uguali !
Cita messaggio
#3
thnx ci avessi capito qualcosa Sad
ma hai creato uno script che avvia calc o excel per vedere sms salvati dal cell bloccato??? ò,ò spiegati un pochino a noi profani
prima di aprire un post usa il tasto cerca nel forum... forse il tuo problema è stato già trattato
Cita messaggio
#4
Uh!
Un essere umano è passato di qua!

A parte gli scherzi, lo script non fa nulla che non possa essere fatto con un editor di testo e qualche decina di clic, soprattutto con le funzioni di CercaESostituisci.
Il problema è quando i file da cui estrarre i dati sono tanti, magari con piccole differenze fra di loro.
È allora che uno script che automatizzi il più possibile le cose può tornare utile.

Il comando awk lancia un programma (di solito gawk) che tratta il testo riga per riga (che nel nostro caso cominciano con ">SMS") estraendone informazioni poste in zone delimitate da un separatore (">").
Sed aveva provveduto a fare delle sostituzioni in modo che awk trovasse solo righe 'pulite' in cui non fare troppi casini.

All'inizio dello script un commento sibillino ma non troppo avverte che la stringa di awk va costruita a seconda di dove si trovano i dati che interesssano.
Ovvero dopo quale delimitatore awk deve leggere il dato.
Per fare ciò si può costruire la prima riga con la stessa struttura che avranno tutte le altre e:
- incollarla in un foglio di calcolo contando i campi
- scriverla in un file (RECORDFILE) da fare leggere a awk specificando il TAG che ci interessa (precede il dato e ne è separato da un delimitatore); l'output renderà il numero del campo da indicare nella stringa di awk.
Usando strftime, un campo data, che nei sistemi linux è dato in unixstamp, viene riformattato in due campi con data e ora.

Prova a prendere o a costruirti un file .xml (<tag1><dato1></tag1><tag2><dato2></tag2>....) e modificando opportunamente lo script vedi se funziona.
Quello che avrai alla fine dovrebbe essere un banale file di testo che aperto con calc, gnumeric o excel ti fa vedere i tuoi dati intabellati.

NB: per lanciare lo script bisogna che lui sia eseguibile e che tu gli passi il file da processare.
Quindi da shell:
script.sh file.xml
[Immagine: http://pclinuxos.com/forum/avatars/Pengu...guitux.png] Parole !
Mai che se ne trovino due uguali !
Cita messaggio
#5
??? lol mi sa che prima che io possa intervenire in tal senso dovrei prendere della documentazione
prima di aprire un post usa il tasto cerca nel forum... forse il tuo problema è stato già trattato
Cita messaggio
#6
Qualcosa te lo impedisce?
[Immagine: http://pclinuxos.com/forum/avatars/Pengu...guitux.png] Parole !
Mai che se ne trovino due uguali !
Cita messaggio
#7
assolutamente Smile
uso quello del prof? cioè quello che spiega il bash?

questo va bene per iniziare???
http://www.istitutomajorana.it/index.php...Itemid=229
prima di aprire un post usa il tasto cerca nel forum... forse il tuo problema è stato già trattato
Cita messaggio
#8
Certo.
Anche in questa sezione trovi molti suggerimenti e spunti.

Prendi qualche spezzone di script o qualche comando suggerito e vedi di capire poi modifichi e riprovi.
Così gradualmente entri nel discorso.

Quando trovi un problema, chiedi e qui qualcuno ti risponderà.
[Immagine: http://pclinuxos.com/forum/avatars/Pengu...guitux.png] Parole !
Mai che se ne trovino due uguali !
Cita messaggio


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)