Déc 092011
 

Il y a des fois ou on aimerait bien reprendre ses comptes en main, et analyser le tout au travers d’un tableur par exemple.

je suis à la banque CIC et à ce titre j’ai accès à l’historique de mes comptes…en pdf.
ce qui n’est pas forcément le meilleur format à insérer dans un tableur. voici une méthode pour convertir ces fichiers PDF en CSV, importables dans n’importe quel tableur.

premièrement, installer pdftohtml, il existe des versions pour Windows ou Linux.
deuxièmement, télécharger les fichiers PDF contenant vos extraits de compte. Je vous conseille retirer les espaces dans le nom des fichiers afin de pouvoir les traiter plus facilement.

pour convertir en html (étape nécessaire), on va lancer la commande suivante :

$ for i in *.pdf
do
pdftohtml.exe -c -i -noframes $i ${i}.html
done

sous windows, la commande est :

FOR /F "tokens=*" %G IN ('dir /b *.pdf') DO pdftohtml.exe -c -i -noframes "%G" "%G.html"

ensuite, on va convertir les fichiers HTML en CSV grâce au script suivant

#!/bin/bash

account=$1
shift 1

solde="0"
thestart="CONTRAT PERSONNEL GLOBAL N.* ${account} en euros"
end="<b>SOLDE"

nbdate=0
linenbr=1
date1=
date2=
tmpone=tmp_1
tmptwo=tmp_2
 
function csvout () {
	# Important : this test must done first in this function
	if [ -z "$fnbline" ] ;then
		refsolde=$solde
	else
		refsolde="F${fnbline}"
	fi

	fdate="$1"
	fdateval="$2"
	flibelle="$(echo "$3" |sed -e 's/[ ]*[ ]/ /g' -e 's/^[ ]*[ ]//' -e 's/&quot;//g' -e 's/&nbsp;//g' -e 's/;/,/g')"
	flibelle2="$(echo "$flibelle" |sed -e 's/^PAIEMENT CB [0-9][0-9][0-9][0-9] //' -e 's/ CARTE [0-9]*[0-9]$//')"
	fdebit="$(echo "$4" |sed 's/\.//g')"
	fcredit="$(echo "$5" |sed 's/\.//g')"
	fnbline="$6"

	fsolde="=SOMME(${refsolde}+G${fnbline})"
	fdiff="=SOMME(E${fnbline}-D${fnbline})"
	echo "${fdate};${fdateval};${flibelle2};${fdebit};${fcredit};${fsolde};${fdiff};${flibelle};"
}

# header
echo "Date;Date de valeur;Libelles;Debits;Credits;Solde;Differentiel;Full libelle;Categorie;"

while [ "${#}" -ne "0" ]
do
	src="$1"
	shift

	awk "/${thestart}/,/${end}/" "$src" | \
	sed 's/<DIV style="position:absolute;top:[0-9]*[0-9];left://g' > $tmpone

	# class name identification for interesting datas
	classname="$(egrep "\">[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]</span>" $tmpone |tail -1 |cut -d'"' -f3)"

	grep "<span class=\"${classname}\">" $tmpone |\
	sed "s/\"><nobr><span class=\"${classname}\">/:/g" |\
	sed 's@</span></nobr></DIV>.*@@' > $tmptwo

	while read theline
	do
		decalage=$(echo "$theline" |cut -d: -f1)
		contents=$(echo "$theline" |cut -d: -f2-)
 
		# date traitment
		if [ "$(echo "$contents" |grep -c "^[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]$")" -ge "1" ]; then
			case $nbdate
			in
				0) # If nbdate is 0, we are in the start of datas
					nbdate=1

					# If date2 is set, we just are in a new line of datas, If not, it is the first line we work on in this script
					[ -n "$date2" ] && csvout "$date1" "$date2" "$data" "$debit" "$credit" "$linenbr"

					linenbr=$(( $linenbr + 1 ))
					date1="$contents"
					data=
					;;
				1) nbdate=0
					date2="$contents"
				;;
			esac
		# label traitment
		elif [ "$(echo "$contents" |egrep -c "[- a-zA-Z]|^[0-9]*[0-9]$")" -ge "1" ]; then
			[ -n "$(echo "$contents" |grep "^Réf : [0-9]*[0-9]$")" ] && continue
			data="$data $contents"
		# amount traitment
		else
			debit=
			credit=

			if [ "$decalage" -lt "700" ]; then
				debit=$contents
			else
				credit=$contents
			fi
		fi
	done < $tmptwo
done

# flush of the last datas
csvout "$date1" "$date2" "$data" "$debit" "$credit" "$linenbr"

# cleaning
rm $tmptwo
rm $tmpone

Pour le lancer rien de plus simple, il vous faudra juste votre numéro de compte à mettre en argument étant donnée qu’un extrait de compte peut contenir plusieurs de vos comptes, il faut bien les délimiter.
vous trouverez votre numéro de compte dans le fichier PDF d’origine.
exemple d’utilisation :

$ ./convert.sh 00030051808 *.html |tee converted.csv

vous noterez que le script prépare déjà les données pour une insertion dans un tableur en calculant les différents champs Solde et Différentiel. facile ensuite d’utiliser l’outil groupe de pilote (LibreOffice) ou rapport de données croisées dynamique (Microsoft Office) pour générer des rapports complets ou même encore des graphiques toujours très parlant.

conseil: prenez le solde du premier fichier PDF que vous convertissez et intégrez le dans le script en remplaçant la variable « solde »

PS: ce script est loin d’être parfait mais il fonctionne chez moi, pour mon besoin.
il se peut que vous ayez un problème de reconnaissance du champs contenant la somme débitée ou créditée car au début, j’ai trouvé plus simple d’identifier ce champs par son contenu, mais il serait plus avisé peut être de calculer ce champs par rapport à son emplacement (valeur de left: dans la ligne).
au pire, si ça ne fonctionne pas chez vous, laissez un petit message pour que je corrige ce qui ne va pas.

  6 commentaires à “convertir les extraits de compte de banque CIC pdf en csv”

  1. Merci pour le script, c’est exactement ce que je voulais faire et après quelques modifications ça fonctionne.

  2. Ha merci pour ces infos, ça m’a fait gagner pas mal de temps 🙂

    J’ai dû modifier quelques lignes du script pour que ça marche, voici ma version :

    #!/bin/bash
    
    account=$1
    shift 1
    
    solde="0"
    thestart=$account
    end="<b>SOLDE"
    
    nbdate=0
    linenbr=1
    date1=
    date2=
    tmpone=tmp_1
    tmptwo=tmp_2
    
    function csvout () {
       # Important : this test must done first in this function
       if [ -z "$fnbline" ] ;then
          refsolde=$solde
       else
          refsolde="F${fnbline}"
       fi
    
       fdate="$1"
       fdateval="$2"
       flibelle="$(echo "$3" |sed -e 's/[ ]*[ ]/ /g' -e 's/^[ ]*[ ]//' -e 's/&quot;//g' -e 's/&nbsp;//g' -e 's/;/,/g')"
       flibelle2="$(echo "$flibelle" |sed -e 's/^PAIEMENT CB [0-9][0-9][0-9][0-9] //' -e 's/ CARTE [0-9]*[0-9]$//')"
       fdebit="$(echo "$4" |sed 's/\.//g')"
       fcredit="$(echo "$5" |sed 's/\.//g')"
       fnbline="$6"
    
       fsolde="=SOMME(${refsolde}+G${fnbline})"
       fdiff="=SOMME(E${fnbline}-D${fnbline})"
       echo "${fdate};${fdateval};${flibelle2};${fdebit};${fcredit};${fsolde};${fdiff};${flibelle};"
    }
    
    # header
    echo "Date;Date de valeur;Libelles;Debits;Credits;Solde;Differentiel;Full libelle;Categorie;"
    
    while [ "${#}" -ne "0" ]
    do
       src="$1"
       shift
    
       awk "/${thestart}/,/${end}/" "$src" | \
       sed 's/ $tmpone
    
       # class name identification for interesting datas
       classname="$(egrep "\">[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]" $tmpone |tail -1 |cut -d'"' -f3)"
    
       grep "class=\"${classname}\">" $tmpone |\
       sed "s/px;white-space:nowrap\" class=\"${classname}\">/:/g" |\
       sed 's@.*@@' > $tmptwo
    
       while read theline
       do
          decalage=$(echo "$theline" |cut -d: -f1)
          contents=$(echo "$theline" |cut -d: -f2-)
    
          # date traitment
          if [ "$(echo "$contents" |grep -c "^[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]$")" -ge "1" ]; then
             case $nbdate
             in
                0) # If nbdate is 0, we are in the start of datas
                   nbdate=1
    
                   # If date2 is set, we just are in a new line of datas, If not, it is the first line we work on in this script
                   [ -n "$date2" ] && csvout "$date1" "$date2" "$data" "$debit" "$credit" "$linenbr"
    
                   linenbr=$(( $linenbr + 1 ))
                   date1="$contents"
                   data=
                   ;;
                1) nbdate=0
                   date2="$contents"
                ;;
             esac
          # label traitment
          elif [ "$(echo "$contents" |egrep -c "[- a-zA-Z]|^[0-9]*[0-9]$")" -ge "1" ]; then
             [ -n "$(echo "$contents" |grep "^Réf : [0-9]*[0-9]$")" ] && continue
             data="$data $contents"
          # amount traitment
          else
             debit=
             credit=
    
             if [ "$decalage" -lt "700" ]; then
                debit=$contents
             else
                credit=$contents
             fi
          fi
       done < $tmptwo
    done
    
    # flush of the last datas
    csvout "$date1" "$date2" "$data" "$debit" "$credit" "$linenbr"
    
    # cleaning
    rm $tmptwo
    rm $tmpone
    </b>
  3. Furrealz? That’s masllvourey good to know.

  4. Very informative and trustworthy blog. Please keep updating with great posts like this one. I have booked marked your site and am about to email it to a few friends of mine that I know would enjoy reading

  5. I enjoy you because of your whole efforts on this blog. Ellie take interest in conducting investigation and it is obvious why. We hear all of the compelling method you provide very useful tips through the web blog and even invigorate contribution from website visitors on this topic while my princess has been understanding so much. Take pleasure in the remaining portion of the year. Your doing a useful job.

 Laisser un commentaire

Vous pouvez utiliser ces tags et attributs HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requis)

(requis)

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.