Batch (ou autre?) modification d'une colonne CSV

Fermé
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 - 14 nov. 2021 à 20:31
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 - 14 nov. 2021 à 23:05
Bonjour,

On m'a refilé un bébé compliqué à soigner: un fichier CSV est extrait d'une base de données (de laquelle j'ignore tout) via un script VBS.

Question subsidiaire, le fichier CSV sort les caractères accentués (je ne sais pas s'ils sont corrects dans la base de données) en mode hiéroglyphique; Y-a-t-il dans VBS auquel je ne comprends rien, un moyen simple comme en Batch d'y remédier?

La date est rendue, colonne 2, au format

AAAA-MM-DD HH:MM.SSS

bien que la fonction de date VBS utilise un format différent, mais ne fait sans doute que récupérer la date système au format long:


dateMaintenant = now()
maintenant = sprintf("{0:yyyyMMddHHmmss}", Array(dateMaintenant))


En dehors des accents, le but de la manoeuvre est d'obtenir un format de date

AAAAMMDDHHMM

Sur un fichier échantillon où je ne prends que 2 colonnes, aucun souci sinon qu'il serait plus simple de rediriger la colonne 2 modifiée vers un fichier externe puis de la remplacer dans le fichier d'origine, mais je ne sais pas comment faire:


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(
FOR /f "tokens=1-2 usebackqdelims=|" %%a IN ("input.csv") DO (
SET "Row2=%%b"
SET "Row2=!Row2:-=!"
SET "Row2=!Row2: =!"
SET "Row2=!Row2::=!"
SET "Row2=!Row2:.=!"
SET "Row2=!Row2:~0,12!
SET "Row1=%%a"
ECHO "%%~a"^|!Row2!>>output.csv
)
)
GOTO :EOF


Là où ça se corse, c'est que le fichier à traiter comporte non seulement un grand nombre de lignes y compris la première de titres qui n'est pas à traiter (cela n'a pas d'importance) mais aussi 70 colonnes tabulées par pipe "|".

On peut toujours envisager, ce n'est pas très élégant, d'écrire 70 variables Row(n), mais le hic est que Tokens n'en accepte que 31 et la condition FOR 26 variables.

On lit ici ou là qu'il y a des astuces à la fois pour augmenter le nombre de Tokens, par exemple:
https://stackoverflow.com/questions/980791/number-of-tokens-limit-in-a-for-command-in-a-windows-batch-script
ou de variables:
https://stackoverflow.com/questions/22867421/how-to-assign-more-than-26-variables-with-for-loop?noredirect=1&lq=1
en imbriquant des commandes FOR, mais la mise en oeuvre n'est pas claire dans mon esprit.

Merci.
A voir également:

2 réponses

barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
14 nov. 2021 à 20:55
Bonjour brucine,

Si tu n'as qu'une seule colonne à modifier (colonne 2) tu n'as pas besoin d'avoir 70 variables.
Tu peux garder ton %%a et %%b et mettre tout le reste dans %%c.

Est-ce que ça t'aide ou pas ?

0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
14 nov. 2021 à 21:03
Bonjour Barnabé,

C'est là que je ne pige pas, j'ai la tête farcie aujourd'hui: si je redirige les 2 premières colonnes comme je l'ai fait dans un fichier de sortie et que je rajoute %%c, ça va me sortir seulement la 3ème colonne, pas les 68 qui restent?
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024
14 nov. 2021 à 21:07
En reprenant ton exemple, un truc comme ça devrait faire l'affaire :

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
(
FOR /f "tokens=1,2,* usebackq delims=|" %%a IN ("input.csv") DO (
 SET "Row2=%%b"
 SET "Row2=!Row2:-=!"
 SET "Row2=!Row2: =!"
 SET "Row2=!Row2::=!"
 SET "Row2=!Row2:.=!"
 SET "Row2=!Row2:~0,12!
 SET "Row1=%%a"
 ECHO "%%~a"^|!Row2!^|%%c>>output.csv
)
)
GOTO :EOF
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
14 nov. 2021 à 21:15
En effet, bête et méchant, je n'avais même pas essayé et je me suis pris la tête toute la journée avec ça tellement j'étais persuadé que %%c ne me sortirait que la 3ème colonne bien qu'il ne soit de fait lui pas "expandé".

Merci.
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024
Modifié le 14 nov. 2021 à 21:19
De rien ;-)

Si tu as beaucoup de variables à traiter, tu aurais aussi pu utiliser une fonction à laquelle tu passes autant de paramètres que tu as de variables, puis tu passes d'un paramètre au suivant en utilisant la commande shift.
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
14 nov. 2021 à 21:22
Oui, bien sûr, mais ça suffit là aux besoins de la cause sans à nouveau écrire du code "pour le plaisir".
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 Ambassadeur 1 557
14 nov. 2021 à 22:11
bonjour,
je n'ai pas tout compris, mais, en VBS, tu pourrais utiliser split(), qui crée un tableau à partir d'une chaîne de caractères, sur base d'un séparateur à passer en paramètre.

VBS est beaucoup plus "riche" qu'un batch, il permet de faire tout ce qu'on peut faire en VB ou en VBA, excepté, pour le VBA, l'intégration avec l'application Microsoft hôte (Excel, ...).
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
14 nov. 2021 à 22:18
Bonsoir,

Tout à fait et aussi probablement par d'autres voies plus "élégantes" (Python, utilitaires Linux de type sed, mais qui étaient de toute façon exclus parce que ce n'est pas moi l'utilisateur et qu'il faut faire avec les moyens du bord...).

Mais outre comme je l'ai dit que je ne comprends rien à VBS, je n'ai pas la main sur le fichier de données, et donc pas grande chance de comprendre ce qu'il faut extraire et à quel format et que je ne peux rien y tester, non plus que je ne connais le format de date original dans la base de données.
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557 > brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024
14 nov. 2021 à 22:33
tu ne montres qu'une partie du VBS, et je ne pense pas que cette partie traite des données du fichier CSV, ni ne génère d'accent.
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729 > yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024
14 nov. 2021 à 23:05
Le VBS extrait les données d'une base de données, s'agissant apparemment de transcriptions audio, vers un fichier CSV.
Je n'ai pas la base de données, et je ne peux pas mettre en ligne le VBS ou un extrait du CSV qui sont confidentiels.

Pour autant, la seule déclaration de format dans le VBS est relative à la date (et mal boutiquée puisqu'elle ne sort pas le format voulu, mais il ne sert à rien que j'essaie de la changer puisque je n'ai pas la base de données pour tester).

Les caractères accentués sont soit déjà présents dans la base de données soit, un peu comme cela se passe en Batch, extraits dans la mauvaise table de caractères; il n'y a qu'un cas spécifique, s'agissant de données pouvant avoir plusieurs provenances, où il existe une syntaxe split pour des noms éventuellement accentués, jamais pour l'adresse, et sans format apparent:

strNomClient = Split(strLine, separateurFichierExport)(14)
0