Batch (ou autre?) modification d'une colonne CSV
brucine
Messages postés
21765
Date d'inscription
Statut
Membre
Dernière intervention
-
brucine Messages postés 21765 Date d'inscription Statut Membre Dernière intervention -
brucine Messages postés 21765 Date d'inscription Statut Membre Dernière intervention -
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:
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:
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.
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:
- Autoit csv
- Autoit - Télécharger - Divers Utilitaires
- Logiciel csv gratuit - Télécharger - Bases de données
- Advanced csv converter - Télécharger - Gestion de données
- Format spbm ou csv - Forum Mobile
- Ouviri fichier extension .spb ✓ - Forum Logiciels
2 réponses
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 ?
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 ?
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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, ...).
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, ...).
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.
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.
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)
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)
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?
Merci.
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.