Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

impression d'une extraction de base de donnée en csv

1 réponse
Avatar
---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 ?

Merci

1 réponse

Avatar
---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 ...