impression d'une extraction de base de donnée en csv
1 réponse
---DGI972---
Bonjour,
Je recupère journalièrement une extraction de base de donnée en csv que
je doit imprimer.
Ce fichier est de la forme:
N°CLIENT;Nom;Prénom;Adre1;CP;VILLE;N°COMMAND;Prix1;Prix2;Prix3;SSTotal;Total
0250;TOTO;Henry;75012;Paris;2205;5.2;665.5;586;12055;11555555
0250;TOTO;Henry;75012;Paris;2205;5.2;665.5;586;12055;11555555
0250;TOTO;Henry;75012;Paris;2206;5.2;65;86;205;550
0250;TOTO;Henry;75012;Paris;2206;5.2;65;86;205;550
0108;TATA;claude;75013;Paris;2206;2;6.5;5;12.5;11.55
Je souhaite l'avoir sous la forme:
TOTO Henry
75012 Paris
0250
2205
5.2 665.5 586 12055 11555555
2206
5.2 65 86 205 550
TATA Claude
75013 Paris
0108
2206
2 6.5 5 12.5 11.55
Faut-il que je demande une autre requête ou vue pour l'extraction ou il
existe des traitements pour les fichier de sortie ?
Comment mettre en page ce genre d'extraction ?
Si quelqu'un peut me faire partager son expérience ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
---DGI972---
Merci Jacques pour ce retour. Concernant le tri des enregistrements, en effet, je manipule le fichier en l'état, sans le trier au préalable. Je suis parti du principe que la moulinette d'extraction de la base de données prenait en compte cette action. Si cela n'est pas le cas alors en effet, je suis "à la rue" ... J'ai hésité et j'aurai dû le spécifier. De plus, trier un fichier selon des champs est super galère en VBScript. Il faut passer par un RecordSet et tout le tremblement ... (une idée de module pour la console WSh Shell !)
Concernant le n°client, CHUT ! Cela ne concerne que le fichier d'exemple, non ?
-- Gilles LAURENT http://glsft.free.fr
"Jacques Barathon [MS]" a écrit dans le message de news: Merci Gilles pour cette traduction. Je note juste que tu ne tries pas le fichier avant de le traiter (à moins que j'aie mal compris quelque chose), ce qui peut poser problème puisque le traitement est purement séquentiel et repose sur le principe que les enregistrements sont regroupés par n°client et par n°command.
Au passage, je note que tu corriges un bug dans mon script en faisant un test sur le changement de n°command OU sur le changement de n°client avant d'afficher l'en-tête d'une nouvelle commande. C'est bien dans la mesure où il semble d'après le fichier fourni que deux clients peuvent avoir des commandes portant le même numéro, et qu'il peut donc arriver que deux commandes se suivent de clients différents mais avec le même n°command.
Jacques "Gilles LAURENT" wrote in message news:u7$ Portage VBScript en essayant de respecter la philosophie du script original :
--- coupez ici --- Set oFs=CreateObject("Scripting.FileSystemObject") Set oField=CreateObject("Scripting.Dictionary") Set oFile=oFs.OpenTextFile("database.csv") arrLines=Split(oFile.ReadAll, VBCrLf) arrHeaders=Split(arrLines(0),";")
' traitement des lignes une par une: For nIndex=1 To uBound(arrLines)-1 arrValues=Split(arrLines(nIndex),";") For nHeader=0 To UBound(arrHeaders) oField(arrHeaders(nHeader))=arrValues(nHeader) Next
cli=oField("N°CLIENT") com=oField("N°COMMAND")
' si nouveau client, affichage de l'en-tête pour le client: If cli <> oldcli Then WScript.Echo WScript.Echo oField("Nom") & " " & oField("Prénom") WScript.Echo oField("Adre1") & " " & oField("CP") & " " & oField("VILLE") WScript.Echo oField("N°CLIENT") End If
' si nouvelle commande, affichage du n° de commande: If com <> oldcom Or cli <> oldcli Then WScript.Echo oField("N°COMMAND") End If
' affichage des détails de la ligne de commande: WScript.Echo _ oField("Prix1") & " " & oField("Prix2") & " " & oField("Prix3") & " " & _ oField("SSTotal") & " " & oField("Total")
oldcli=cli oldcom=com Next --- coupez ici ---
-- Gilles LAURENT http://glsft.free.fr
"Jacques Barathon [MS]" a écrit dans le message de news: "---DGI972---" <gilles.dermigny@*NO SPAM* laposte.net> wrote in message news: > Bonjour, >
Je recupère journalièrement une extraction de base de donnée en csv que > je doit imprimer.
Ce fichier est de la forme: ...
Je souhaite l'avoir sous la forme: ...
Faut-il que je demande une autre requête ou vue pour l'extraction ou il > existe des traitements pour les fichier de sortie ?
Comment mettre en page ce genre d'extraction ? Si quelqu'un peut me faire partager son expérience ?
Je vais me faire appeler Arthur encore une fois pour mettre en avant PowerShell ;-). Pourtant, on est typiquement dans un usage où PowerShell excelle en permettant de tester rapidement le résultat de manipulations sur des données, ici les données importées d'un fichier CSV.
Il faut commencer par importer le fichier en tant que CSV (au passage, j'ai ajouté un séparateur dans les lignes de données pour marquer l'absence de valeur pour le champ Adre1). Seul hic, tu utilises un point-virgule comme séparateur, ce qui est le standard en France, mais PowerShell ne reconnait (pour l'instant?) que le standard US qui est la virgule. Il faut donc commencer par faire un remplacement:
PS> (type fic.csv) -replace ";","," > fic2.csv
On peut alors importer le fichier fic2.csv dans une variable:
PS> $fic = import-csv fic2.csv
$fic contient alors les enregistrements bien rangés, comme en témoigne ce petit extrait:
PS> $fic | format-table
N°CLIENT Nom Prénom Adre1 CP VILLE N°COMMAND Prix1 ... -------- --- ------ ----- -- ----- --------- ----- 0250 TOTO Henry 75012 Paris 2205 5.2 0250 TOTO Henry 75012 Paris 2205 5.2 ...
Il ne reste plus qu'à énumérer les enregistrements en leur appliquant le format désiré. Ici, le format est loin d'être standard, il faut alors appliquer une petite moulinette, sur le même principe que celle qu'on a conçue il y a quelques jours pour insérer un saut de ligne à chaque changement de nom. Le script au complet (y compris les manips ci-dessus) ressemblera à ceci:
--- couper ici --- param($fichier)
# remplacement des points-virgule par des virgules dans un fichier temp: $tempfic = [io.path]::GetTempFileName() (type $fichier) -replace ";","," > $tempfic
# importation du fichier CSV: $fic = import-csv $tempfic
# tri du fichier et traitement des lignes une par une: $fic | sort n°client,n°command | foreach {
$cli = $_."n°client" $com = $_."n°command"
# si nouveau client, affichage de l'en-tête pour le client: if ($cli -ne $oldcli) { "" "{0} {1}" -f $_.nom,$_.prénom "{0} {1} {2}" -f $_.Adre1,$_.CP,$_.Ville "{0}" -f $_."n°client" } # si nouvelle commande, affichage du n° de commande: if ($com -ne $oldcom) { "{0}" -f $_."n°command" } # affichage des détails de la ligne de commande: "{0} {1} {2} {3} {4}" -f $_.Prix1,$_.Prix2,$_.Prix3,$_.SSTotal,$_.Total
$oldcli=$cli $oldcom = $com }
# suppression du fichier temp: del $tempfic
--- couper ici ---
Le résultat du script en lui passant le fichier fourni en exemple donnera ceci:
TATA claude 75013 Paris 0108 2206 2 6.5 5 12.5 11.55
TOTO Henry 75012 Paris 0250 2205 5.2 665.5 586 12055 11555555 5.2 665.5 586 12055 11555555 2206 5.2 65 86 205 550 5.2 65 86 205 550
L'espace devant le CP vient du champ Adre1 qui est vide... A modifier selon le contenu réel de ton fichier.
Je n'ai aucun doute qu'on puisse adapter cette solution à VBScript. Il est même probable qu'on puisse optimiser le traitement. Mais bon, il s'agit d'un exemple qui applique une logique simple, justement pour qu'elle soit non seulement facilement compréhensible mais facilement adaptable à un autre langage et/ou à un autre besoin.
Jacques
Avec beaucoup de retard j'ai eu le droit a un beau:
ligne 11 caract 9 Indice en dehors de la plage :'nHeader'
Désolé mais moi cela m'inspire absoluement rien ...
Merci Jacques pour ce retour. Concernant le tri des enregistrements, en
effet, je manipule le fichier en l'état, sans le trier au préalable. Je suis
parti du principe que la moulinette d'extraction de la base de données
prenait en compte cette action. Si cela n'est pas le cas alors en effet, je
suis "à la rue" ... J'ai hésité et j'aurai dû le spécifier. De plus, trier un
fichier selon des champs est super galère en VBScript. Il faut passer par un
RecordSet et tout le tremblement ... (une idée de module pour la console WSh
Shell !)
Concernant le n°client, CHUT ! Cela ne concerne que le fichier d'exemple, non
?
--
Gilles LAURENT
http://glsft.free.fr
"Jacques Barathon [MS]" <jbaratho@online.microsoft.com> a écrit dans le
message de news:eMFCCZwbHHA.4544@TK2MSFTNGP03.phx.gbl... Merci Gilles pour
cette traduction. Je note juste que tu ne tries pas le fichier avant de le
traiter (à moins que j'aie mal compris quelque chose), ce qui peut poser
problème puisque le traitement est purement séquentiel et repose sur le
principe que les enregistrements sont regroupés par n°client et par
n°command.
Au passage, je note que tu corriges un bug dans mon script en faisant un
test sur le changement de n°command OU sur le changement de n°client avant
d'afficher l'en-tête d'une nouvelle commande. C'est bien dans la mesure où il
semble d'après le fichier fourni que deux clients peuvent avoir des commandes
portant le même numéro, et qu'il peut donc arriver que deux commandes se
suivent de clients différents mais avec le même n°command.
Jacques
"Gilles LAURENT" <glsft@free.fr> wrote in message
news:u7$uSXvbHHA.3584@TK2MSFTNGP02.phx.gbl... Portage VBScript en
essayant de respecter la philosophie du script original :
--- coupez ici ---
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oField=CreateObject("Scripting.Dictionary")
Set oFile=oFs.OpenTextFile("database.csv")
arrLines=Split(oFile.ReadAll, VBCrLf)
arrHeaders=Split(arrLines(0),";")
' traitement des lignes une par une:
For nIndex=1 To uBound(arrLines)-1
arrValues=Split(arrLines(nIndex),";")
For nHeader=0 To UBound(arrHeaders)
oField(arrHeaders(nHeader))=arrValues(nHeader)
Next
cli=oField("N°CLIENT")
com=oField("N°COMMAND")
' si nouveau client, affichage de l'en-tête pour le client:
If cli <> oldcli Then
WScript.Echo
WScript.Echo oField("Nom") & " " & oField("Prénom")
WScript.Echo oField("Adre1") & " " & oField("CP") & " " &
oField("VILLE") WScript.Echo oField("N°CLIENT")
End If
' si nouvelle commande, affichage du n° de commande:
If com <> oldcom Or cli <> oldcli Then
WScript.Echo oField("N°COMMAND")
End If
' affichage des détails de la ligne de commande:
WScript.Echo _
oField("Prix1") & " " & oField("Prix2") & " " & oField("Prix3") &
" " & _ oField("SSTotal") & " " & oField("Total")
oldcli=cli
oldcom=com
Next
--- coupez ici ---
--
Gilles LAURENT
http://glsft.free.fr
"Jacques Barathon [MS]" <jbaratho@online.microsoft.com> a écrit dans le
message de news:ekUOjuWbHHA.4632@TK2MSFTNGP03.phx.gbl... "---DGI972---"
<gilles.dermigny@*NO SPAM* laposte.net> wrote in message
news:mn.b5767d738cb50d9c.55474@NOSPAMlaposte.net... > Bonjour, >
Je recupère journalièrement une extraction de base de donnée en csv
que > je doit imprimer.
Ce fichier est de la forme:
...
Je souhaite l'avoir sous la forme:
...
Faut-il que je demande une autre requête ou vue pour l'extraction ou
il > existe des traitements pour les fichier de sortie ?
Comment mettre en page ce genre d'extraction ?
Si quelqu'un peut me faire partager son expérience ?
Je vais me faire appeler Arthur encore une fois pour mettre en avant
PowerShell ;-). Pourtant, on est typiquement dans un usage où PowerShell
excelle en permettant de tester rapidement le résultat de manipulations sur
des données, ici les données importées d'un fichier CSV.
Il faut commencer par importer le fichier en tant que CSV (au passage,
j'ai ajouté un séparateur dans les lignes de données pour marquer l'absence
de valeur pour le champ Adre1). Seul hic, tu utilises un point-virgule comme
séparateur, ce qui est le standard en France, mais PowerShell ne reconnait
(pour l'instant?) que le standard US qui est la virgule. Il faut donc
commencer par faire un remplacement:
PS> (type fic.csv) -replace ";","," > fic2.csv
On peut alors importer le fichier fic2.csv dans une variable:
PS> $fic = import-csv fic2.csv
$fic contient alors les enregistrements bien rangés, comme en témoigne
ce petit extrait:
PS> $fic | format-table
N°CLIENT Nom Prénom Adre1 CP VILLE
N°COMMAND Prix1 ... -------- --- ------ -----
-- ----- --------- ----- 0250 TOTO Henry
75012 Paris 2205 5.2 0250
TOTO Henry 75012 Paris 2205 5.2
...
Il ne reste plus qu'à énumérer les enregistrements en leur appliquant
le format désiré. Ici, le format est loin d'être standard, il faut alors
appliquer une petite moulinette, sur le même principe que celle qu'on a
conçue il y a quelques jours pour insérer un saut de ligne à chaque
changement de nom. Le script au complet (y compris les manips ci-dessus)
ressemblera à ceci:
--- couper ici ---
param($fichier)
# remplacement des points-virgule par des virgules dans un fichier
temp: $tempfic = [io.path]::GetTempFileName()
(type $fichier) -replace ";","," > $tempfic
# importation du fichier CSV:
$fic = import-csv $tempfic
# tri du fichier et traitement des lignes une par une:
$fic | sort n°client,n°command | foreach {
$cli = $_."n°client"
$com = $_."n°command"
# si nouveau client, affichage de l'en-tête pour le client:
if ($cli -ne $oldcli) {
""
"{0} {1}" -f $_.nom,$_.prénom
"{0} {1} {2}" -f $_.Adre1,$_.CP,$_.Ville
"{0}" -f $_."n°client"
}
# si nouvelle commande, affichage du n° de commande:
if ($com -ne $oldcom) {
"{0}" -f $_."n°command"
}
# affichage des détails de la ligne de commande:
"{0} {1} {2} {3} {4}" -f
$_.Prix1,$_.Prix2,$_.Prix3,$_.SSTotal,$_.Total
$oldcli=$cli
$oldcom = $com
}
# suppression du fichier temp:
del $tempfic
--- couper ici ---
Le résultat du script en lui passant le fichier fourni en exemple
donnera ceci:
TATA claude
75013 Paris
0108
2206
2 6.5 5 12.5 11.55
TOTO Henry
75012 Paris
0250
2205
5.2 665.5 586 12055 11555555
5.2 665.5 586 12055 11555555
2206
5.2 65 86 205 550
5.2 65 86 205 550
L'espace devant le CP vient du champ Adre1 qui est vide... A modifier
selon le contenu réel de ton fichier.
Je n'ai aucun doute qu'on puisse adapter cette solution à VBScript. Il
est même probable qu'on puisse optimiser le traitement. Mais bon, il s'agit
d'un exemple qui applique une logique simple, justement pour qu'elle soit non
seulement facilement compréhensible mais facilement adaptable à un autre
langage et/ou à un autre besoin.
Jacques
Avec beaucoup de retard j'ai eu le droit a un beau:
ligne 11
caract 9
Indice en dehors de la plage :'nHeader'
Désolé mais moi cela m'inspire absoluement rien ...
Merci Jacques pour ce retour. Concernant le tri des enregistrements, en effet, je manipule le fichier en l'état, sans le trier au préalable. Je suis parti du principe que la moulinette d'extraction de la base de données prenait en compte cette action. Si cela n'est pas le cas alors en effet, je suis "à la rue" ... J'ai hésité et j'aurai dû le spécifier. De plus, trier un fichier selon des champs est super galère en VBScript. Il faut passer par un RecordSet et tout le tremblement ... (une idée de module pour la console WSh Shell !)
Concernant le n°client, CHUT ! Cela ne concerne que le fichier d'exemple, non ?
-- Gilles LAURENT http://glsft.free.fr
"Jacques Barathon [MS]" a écrit dans le message de news: Merci Gilles pour cette traduction. Je note juste que tu ne tries pas le fichier avant de le traiter (à moins que j'aie mal compris quelque chose), ce qui peut poser problème puisque le traitement est purement séquentiel et repose sur le principe que les enregistrements sont regroupés par n°client et par n°command.
Au passage, je note que tu corriges un bug dans mon script en faisant un test sur le changement de n°command OU sur le changement de n°client avant d'afficher l'en-tête d'une nouvelle commande. C'est bien dans la mesure où il semble d'après le fichier fourni que deux clients peuvent avoir des commandes portant le même numéro, et qu'il peut donc arriver que deux commandes se suivent de clients différents mais avec le même n°command.
Jacques "Gilles LAURENT" wrote in message news:u7$ Portage VBScript en essayant de respecter la philosophie du script original :
--- coupez ici --- Set oFs=CreateObject("Scripting.FileSystemObject") Set oField=CreateObject("Scripting.Dictionary") Set oFile=oFs.OpenTextFile("database.csv") arrLines=Split(oFile.ReadAll, VBCrLf) arrHeaders=Split(arrLines(0),";")
' traitement des lignes une par une: For nIndex=1 To uBound(arrLines)-1 arrValues=Split(arrLines(nIndex),";") For nHeader=0 To UBound(arrHeaders) oField(arrHeaders(nHeader))=arrValues(nHeader) Next
cli=oField("N°CLIENT") com=oField("N°COMMAND")
' si nouveau client, affichage de l'en-tête pour le client: If cli <> oldcli Then WScript.Echo WScript.Echo oField("Nom") & " " & oField("Prénom") WScript.Echo oField("Adre1") & " " & oField("CP") & " " & oField("VILLE") WScript.Echo oField("N°CLIENT") End If
' si nouvelle commande, affichage du n° de commande: If com <> oldcom Or cli <> oldcli Then WScript.Echo oField("N°COMMAND") End If
' affichage des détails de la ligne de commande: WScript.Echo _ oField("Prix1") & " " & oField("Prix2") & " " & oField("Prix3") & " " & _ oField("SSTotal") & " " & oField("Total")
oldcli=cli oldcom=com Next --- coupez ici ---
-- Gilles LAURENT http://glsft.free.fr
"Jacques Barathon [MS]" a écrit dans le message de news: "---DGI972---" <gilles.dermigny@*NO SPAM* laposte.net> wrote in message news: > Bonjour, >
Je recupère journalièrement une extraction de base de donnée en csv que > je doit imprimer.
Ce fichier est de la forme: ...
Je souhaite l'avoir sous la forme: ...
Faut-il que je demande une autre requête ou vue pour l'extraction ou il > existe des traitements pour les fichier de sortie ?
Comment mettre en page ce genre d'extraction ? Si quelqu'un peut me faire partager son expérience ?
Je vais me faire appeler Arthur encore une fois pour mettre en avant PowerShell ;-). Pourtant, on est typiquement dans un usage où PowerShell excelle en permettant de tester rapidement le résultat de manipulations sur des données, ici les données importées d'un fichier CSV.
Il faut commencer par importer le fichier en tant que CSV (au passage, j'ai ajouté un séparateur dans les lignes de données pour marquer l'absence de valeur pour le champ Adre1). Seul hic, tu utilises un point-virgule comme séparateur, ce qui est le standard en France, mais PowerShell ne reconnait (pour l'instant?) que le standard US qui est la virgule. Il faut donc commencer par faire un remplacement:
PS> (type fic.csv) -replace ";","," > fic2.csv
On peut alors importer le fichier fic2.csv dans une variable:
PS> $fic = import-csv fic2.csv
$fic contient alors les enregistrements bien rangés, comme en témoigne ce petit extrait:
PS> $fic | format-table
N°CLIENT Nom Prénom Adre1 CP VILLE N°COMMAND Prix1 ... -------- --- ------ ----- -- ----- --------- ----- 0250 TOTO Henry 75012 Paris 2205 5.2 0250 TOTO Henry 75012 Paris 2205 5.2 ...
Il ne reste plus qu'à énumérer les enregistrements en leur appliquant le format désiré. Ici, le format est loin d'être standard, il faut alors appliquer une petite moulinette, sur le même principe que celle qu'on a conçue il y a quelques jours pour insérer un saut de ligne à chaque changement de nom. Le script au complet (y compris les manips ci-dessus) ressemblera à ceci:
--- couper ici --- param($fichier)
# remplacement des points-virgule par des virgules dans un fichier temp: $tempfic = [io.path]::GetTempFileName() (type $fichier) -replace ";","," > $tempfic
# importation du fichier CSV: $fic = import-csv $tempfic
# tri du fichier et traitement des lignes une par une: $fic | sort n°client,n°command | foreach {
$cli = $_."n°client" $com = $_."n°command"
# si nouveau client, affichage de l'en-tête pour le client: if ($cli -ne $oldcli) { "" "{0} {1}" -f $_.nom,$_.prénom "{0} {1} {2}" -f $_.Adre1,$_.CP,$_.Ville "{0}" -f $_."n°client" } # si nouvelle commande, affichage du n° de commande: if ($com -ne $oldcom) { "{0}" -f $_."n°command" } # affichage des détails de la ligne de commande: "{0} {1} {2} {3} {4}" -f $_.Prix1,$_.Prix2,$_.Prix3,$_.SSTotal,$_.Total
$oldcli=$cli $oldcom = $com }
# suppression du fichier temp: del $tempfic
--- couper ici ---
Le résultat du script en lui passant le fichier fourni en exemple donnera ceci:
TATA claude 75013 Paris 0108 2206 2 6.5 5 12.5 11.55
TOTO Henry 75012 Paris 0250 2205 5.2 665.5 586 12055 11555555 5.2 665.5 586 12055 11555555 2206 5.2 65 86 205 550 5.2 65 86 205 550
L'espace devant le CP vient du champ Adre1 qui est vide... A modifier selon le contenu réel de ton fichier.
Je n'ai aucun doute qu'on puisse adapter cette solution à VBScript. Il est même probable qu'on puisse optimiser le traitement. Mais bon, il s'agit d'un exemple qui applique une logique simple, justement pour qu'elle soit non seulement facilement compréhensible mais facilement adaptable à un autre langage et/ou à un autre besoin.
Jacques
Avec beaucoup de retard j'ai eu le droit a un beau:
ligne 11 caract 9 Indice en dehors de la plage :'nHeader'
Désolé mais moi cela m'inspire absoluement rien ...