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

split pour extraction de donnée et recopie dans un fichier

9 réponses
Avatar
---DGI972---
Bonjour,

Je travaille sur un petit script qui doit lire un fichier txt qui
contient des N°Adhérent et si ce numéro existe dans le fichier CSV (en
2 ième position dans le csv) le script doit créer un troisième fichier
avec la ligne qui contient le N°Adhérent avec le nom du fichier cvs et
le nom du fichier

Je bute sur 2 Pb:

* le nom du fichier de sortie avec .GetFileName je ne veux pas
l'extension
* La boucle est elle correcte ?

Voici un exemple de fichier cab010108.txt qui contient les numéros
d'adhérents

12454
125455
12554

Voici un exemple de fichier testtoto.csv

cde sexe;N°adh;nadhcode;nom prénom;adresse
2;51268;*51268*;VAAR MARTHE MONARD ;FELIX 1 MORNES DES ESSES
1;12454;*62670*;MANDE EMILE ;CAP CHEVALIER
2;125455;*128200*;BAUR AMELIE ;RUE DU DOCTEUR ST PRIX
2;295270;*295270*;PANTA/MICHEL HERMENCIA;34 AVE GOZELAN
2;5207;*5207*;HALMA LAURE MARIE ;32 RUE DU SOURD
2;12554;*93968*;GARA FRANCOISE ;4 RUE DU RELAIS

Et je voudrais en sortie le fichier testtoto_cab010108.csv

1;12454;*62670*;MANDE EMILE ;CAP CHEVALIER
2;125455;*128200*;BAUR AMELIE ;RUE DU DOCTEUR ST PRIX
2;12554;*93968*;GARA FRANCOISE ;4 RUE DU RELAIS



Debut du Script

Title = "Extraction CAB V1.0"
Prompt = "Voulez vous lancer l'extraction des CAB des Fichiers CSV "_
&VbCrLf&VbCrLf&"1/ Choisir le fichier CSV "_
&VbCrLf&"2/ Choisir le fichier TXT CAB?"_
&VbCrLf&VbCrLf&"Le fichier sera créé dans le répertoire D:\EDITION\"_
&VbCrLf&"Avec le Non du fichier CSV_Nom du TXT CAB.CSV"
messagefile = msgbox(Prompt, vbOKCancel, Title)
IF messagefile = 2 then
wscript.quit
END IF
Wscript.Echo "1/ Choisir le fichier CSV!."
fichCSV = ChooseFile()
Wscript.Echo "2/ Choisir le fichier TXT CAB!."
fichCAB = ChooseFile()
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oFileCSV=oFs.OpenTextFile(fichCSV)
Set oFileCAB=oFs.OpenTextFile(fichCAB)
Set
oFileOut=oFs.OpenTextFile("C:\GILLES\EDITION\"&oFs.GetFileName(fichCSV)&"_"&oFs.GetFileName(fichCAB)&".csv",2,
True)
cab=Split(oFileCAB.ReadAll,VBCrLf)
For Each strLine In cab
csv=Split(oFileCSV.ReadAll,VBCrLf)
For Each strField In csv
if strline=Split(csv(1),";") then oFileOut.Write strField
Next
Next

wscript.echo "L'Extraction a bien été traitée "
WScript.Quit

'***********************************************************************

Function ChooseFile()
On Error Resume Next
Dim Q2, sRet
Q2 = chr(34)
ChooseFile = ""
Set IE = CreateObject("InternetExplorer.Application")
IE.visible = False
IE.Navigate("about:blank")
Do Until IE.ReadyState = 4
Loop
IE.Document.Write "<HTML><BODY><INPUT ID=" & Q2 & "Fil" & Q2 &
"Type=" & Q2 & "file" & Q2 & "></BODY></HTML>"
With IE.Document.all.Fil
.focus
.click
ChooseFile = .value
End With
IE.Quit
Set IE = Nothing
End Function
'***********************************************************************
Fin du Script
Un petit coup de pousse serait le bien venu
Merci

9 réponses

Avatar
Méta-MCI \(MVP\)
Bonjour !

Le petit batch ci-dessous doit faire ce que tu demandes.

@echo off
echo.
IF EXIST testtoto_cab010108.csv DEL testtoto_cab010108.csv
FOR /F "tokens=*" %%i IN (010108.txt) DO CALL :SUB %%i
type testtoto_cab010108.csv
goto :EOF

:SUB
FOR /F "tokens=*" %%i IN ('type testtoto.csv ^| find ";%*"') DO echo
%%i>>testtoto_cab010108.csv
goto :EOF



J'en profite pour signaler que, suite aux Techdays, on peut affirmer que
Microsoft a donné un signe fort, pour le retour du BATCH. En effet,
tous les Windows-2008-Serveurs peuvent être installés en mode "Core".
Et, dans ce mode, sans interface graphique, ni dotNET
installé/installable, les batchs sont rois.
PowerShell, s'appuyant sur dotNET, n'y fonctionne pas.
Cependant, par honnêteté, je signale que VBscript et JScript
fonctionnent également (uniquement en CScript, en invite de commande).

@+

Michel Claveau
Avatar
---DGI972---
Bonjour !

Le petit batch ci-dessous doit faire ce que tu demandes.

@echo off
echo.
IF EXIST testtoto_cab010108.csv DEL testtoto_cab010108.csv
FOR /F "tokens=*" %%i IN (010108.txt) DO CALL :SUB %%i
type testtoto_cab010108.csv
goto :EOF

:SUB
FOR /F "tokens=*" %%i IN ('type testtoto.csv ^| find ";%*"') DO echo
%%i>>testtoto_cab010108.csv
goto :EOF



J'en profite pour signaler que, suite aux Techdays, on peut affirmer que
Microsoft a donné un signe fort, pour le retour du BATCH. En effet, tous les
Windows-2008-Serveurs peuvent être installés en mode "Core". Et, dans ce
mode, sans interface graphique, ni dotNET installé/installable, les batchs
sont rois.
PowerShell, s'appuyant sur dotNET, n'y fonctionne pas.
Cependant, par honnêteté, je signale que VBscript et JScript fonctionnent
également (uniquement en CScript, en invite de commande).

@+

Michel Claveau


Cela fonctionne bien avec des fichiers en noms fixes.
Je pensais plus en VBS ...
merci quand même

Avatar
---DGI972---
Bonjour !

Le petit batch ci-dessous doit faire ce que tu demandes.

@echo off
echo.
IF EXIST testtoto_cab010108.csv DEL testtoto_cab010108.csv
FOR /F "tokens=*" %%i IN (010108.txt) DO CALL :SUB %%i
type testtoto_cab010108.csv
goto :EOF

:SUB
FOR /F "tokens=*" %%i IN ('type testtoto.csv ^| find ";%*"') DO echo
%%i>>testtoto_cab010108.csv
goto :EOF



J'en profite pour signaler que, suite aux Techdays, on peut affirmer que
Microsoft a donné un signe fort, pour le retour du BATCH. En effet, tous
les Windows-2008-Serveurs peuvent être installés en mode "Core". Et, dans
ce mode, sans interface graphique, ni dotNET installé/installable, les
batchs sont rois.
PowerShell, s'appuyant sur dotNET, n'y fonctionne pas.
Cependant, par honnêteté, je signale que VBscript et JScript fonctionnent
également (uniquement en CScript, en invite de commande).

@+

Michel Claveau


Cela fonctionne bien avec des fichiers en noms fixes.
Je pensais plus en VBS ...
merci quand même


Je me répond a moi même pour le premier point

un .GetBaseName renvoit le nom du fichier sans l'extension.

Pour le point 2 ma ligne:
if strline=Split(csv(1),";") then oFileOut.Write strField
n'est pas bonne

je cherche encore et encore


Avatar
Gilles LAURENT [MVP]
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:

Bonsoir,

| Pour le point 2 ma ligne:
| if strline=Split(csv(1),";") then oFileOut.Write strField
| n'est pas bonne
|
| je cherche encore et encore

Peut-être comme cela :

cab=Split(oFileCAB.ReadAll,VBCrLf)
csv=Split(oFileCSV.ReadAll,VBCrLf)
For Each strLine In cab
For Each strField In csv
If strLine = Split(strField,";")(1) Then oFileOut.Write strField
Next
Next

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
---DGI972---
Gilles LAURENT [MVP] avait prétendu :
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:

Bonsoir,

Pour le point 2 ma ligne:
if strline=Split(csv(1),";") then oFileOut.Write strField
n'est pas bonne

je cherche encore et encore


Peut-être comme cela :

cab=Split(oFileCAB.ReadAll,VBCrLf)
csv=Split(oFileCSV.ReadAll,VBCrLf)
For Each strLine In cab
For Each strField In csv
If strLine = Split(strField,";")(1) Then oFileOut.Write strField
Next
Next


Merci gilles pour votre intêret a mon problème:

J'ai eu droit a un beau indice en dehors de la plage :'[Number:1]
a la ligne:
If strLine = Split(strField,";")(1) Then oFileOut.Write strField


Avatar
Gilles LAURENT [MVP]
Bonjour Gilles,

| J'ai eu droit a un beau indice en dehors de la plage :'[Number:1]
| a la ligne:
| If strLine = Split(strField,";")(1) Then oFileOut.Write strField

Cela doit être causé par des crlf en fin de fichier. Un test est donc ajouté
pour s'assurer que la ligne contient au moins deux éléments.

cab=Split(oFileCAB.ReadAll,VBCrLf)
csv=Split(oFileCSV.ReadAll,VBCrLf)
For Each strLine In cab
For Each strField In csv
If UBound(Split(strField,";")) > 1 Then
If strLine = Split(strField,";")(1) Then oFileOut.WriteLine strField
End If
Next
Next

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
---DGI972---
Bonjour Gilles,

J'ai eu droit a un beau indice en dehors de la plage :'[Number:1]
a la ligne:
If strLine = Split(strField,";")(1) Then oFileOut.Write strField


Cela doit être causé par des crlf en fin de fichier. Un test est donc ajouté
pour s'assurer que la ligne contient au moins deux éléments.

cab=Split(oFileCAB.ReadAll,VBCrLf)
csv=Split(oFileCSV.ReadAll,VBCrLf)
For Each strLine In cab
For Each strField In csv
If UBound(Split(strField,";")) > 1 Then
If strLine = Split(strField,";")(1) Then oFileOut.WriteLine strField
End If
Next
Next


Yes !!!
You are the Best ...

Je peux abuser ...
Comment récupérer le chemin dans lequel tourne le vbs en question pour
pouvoir copier le fichier résultat dans le même répertoire ou tourne le
vbs.

Et encore merci


Avatar
Gilles LAURENT [MVP]
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:
| Comment récupérer le chemin dans lequel tourne le vbs en question pour
| pouvoir copier le fichier résultat dans le même répertoire ou tourne
| le vbs.

Plusieurs méthodes sont possibles ;-)
Personnellement je préfère m'appuyer sur la méthode gpfn :

Set oFs=CreateObject("Scripting.FileSystemObject")
sCurrentFolder=oFs.GetParentFolderName(WScript.ScriptFullName)
WScript.Echo sCurrentFolder

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
---DGI972---
Gilles LAURENT [MVP] vient de nous annoncer :
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:
Comment récupérer le chemin dans lequel tourne le vbs en question pour
pouvoir copier le fichier résultat dans le même répertoire ou tourne
le vbs.


Plusieurs méthodes sont possibles ;-)
Personnellement je préfère m'appuyer sur la méthode gpfn :

Set oFs=CreateObject("Scripting.FileSystemObject")
sCurrentFolder=oFs.GetParentFolderName(WScript.ScriptFullName)
WScript.Echo sCurrentFolder


Super avec un petit &""& voila le résultat pour mon fichier de sortie:

Set
oFileOut=oFs.OpenTextFile(sCurrentFolder&""&oFs.GetBaseName(fichCSV)&"_"&oFs.GetBaseName(fichCAB)&".csv",2,
True)


Affaire bouclée.
Je connais une collègue qui va être contente pour ce traitement
ponctuel.

Merci gilles

NB: c'est quoi la méthode gpfn (pour ne pas mourrir idiot) ?