Aide à l'écriture d'un script batch pour analyser le fichier CSV et de sortie d'un fichier texte
J'ai du mal à écrire un script batch qui permet de lire un fichier CSV comme ci-dessous
Name:, City:, Country:
Mark, London, UK
Ben, Paris, France
Tom, Athens, Greece
Il y aura une ligne d'en-tête dans le fichier CSV. Il doit la sortie vers un fichier texte comme ci-dessous:
Name:Mark
City:London
Country:UK
Name:Ben
City:Paris
Country:France
Name:Tom
City:Athens
Country:Greece
Le séparateur de champ (:) dans le dessus de la production devrait être fournie dans la ligne d'en-tête lui-même. Donc, tout ce que je dois faire est de concaténer le champ titre et sa valeur.
Le nombre de colonnes dans ce fichier CSV n'est pas fixe, donc le script ne doit pas se limiter à 3 jetons. Aide gentiment!
langue agnostique (je peux vous fournir des conseils sur la façon de résoudre ce cas en perl)?
Merci de codage en perl n'est pas de me troubler.
1. Sont il y a toujours des espaces après les virgules? 2. Peut jetons (si les en-têtes ou des valeurs) contiennent des espaces? 3. Est-il un nombre maximal de jetons? 4. Peut contenir des jetons de virgules?
1.Il n'y aura pas d'espace après la virgule, même si il serait mieux de prendre cette affaire. 2. Les jetons peuvent contenir des espaces. 3. Le pas de. de jetons n'est pas fixe. Cependant, si vous faites référence maximale admissible jetons ouais, ça peut être fixée à une valeur raisonnable (10 ou quelque chose). 4. Jetons strictement ne peut pas contenir de virgule.
Le perl solution que j'ai trouvé qui peut être fait avec un one-liner.
Merci de codage en perl n'est pas de me troubler.
use strict; use Data::Dumper; my $filename = $ARGV[0]; open FILE, $filename or die; my $header = <FILE>; my @keys = split /,/, $header; my @data; for my $line (<FILE>){ chomp; my @values = split /,/, $line; my %data_rows; @data_rows{@keys} = @values; push @data, %data_rows; } print Dumper(\\@data);
Mais j'ai besoin d'un Windows script batch solution. Je trouve qu'il est difficile d'exprimer pleinement avec le script de commandes.1. Sont il y a toujours des espaces après les virgules? 2. Peut jetons (si les en-têtes ou des valeurs) contiennent des espaces? 3. Est-il un nombre maximal de jetons? 4. Peut contenir des jetons de virgules?
1.Il n'y aura pas d'espace après la virgule, même si il serait mieux de prendre cette affaire. 2. Les jetons peuvent contenir des espaces. 3. Le pas de. de jetons n'est pas fixe. Cependant, si vous faites référence maximale admissible jetons ouais, ça peut être fixée à une valeur raisonnable (10 ou quelque chose). 4. Jetons strictement ne peut pas contenir de virgule.
Le perl solution que j'ai trouvé qui peut être fait avec un one-liner.
perl -F, -lane "if ($.==1) {@keys = @F} else{print @keys[$_].$F[$_] foreach(0..$#F)} "
Pourquoi j'ai besoin de script batch est parce qu'il est plus facile de partager avec mes collègues qui n'ont pas les privilèges pour installer perl sur leurs machines.OriginalL'auteur Benny | 2011-06-24
Vous devez vous connecter pour publier un commentaire.
Ce lot scipt:
accepte un seul paramètre, le nom du fichier à traiter;
ne vérifie pas la présence de
:
à la fin d'un en-tête de jeton, et lorsque les valeurs sont affichées, elles sont placées immédiatement après l'en-tête correspondant jetons;garnitures de tous les espaces de tête (mais pas de fuite);
considère la première ligne à la ligne d'en-tête, qui définit également le nombre de jetons de processus dans les lignes suivantes;
prend en charge jusqu'à 10 jetons, et les deux domaines mis en évidence en caractères gras et italiques sont responsables pour que (lorsque vous avez besoin de modifier le nombre maximum, de modifier les deux zones: si vous augmentez le nombre, vous devez développer la
"%%a" "%%b" "%%c" …
liste, et, de même, si vous diminuez le nombre, puis réduire la liste).Désolé j'ai supprimé mon premier commentaire depuis que c'était un faux observation. Le code fonctionne très bien! Il y a quelques cas limites, mais je serai heureux de le prendre.
Oui, les guillemets doubles étaient sur mon esprit, mais j'ai rapidement écarté la notion d'eux, et que, sous prétexte que vous n'avez jamais dit un mot sur eux dans votre post, comment commode, n'est-ce pas? 🙂 Mais je dois dire que si j'ai essayé de les prendre en compte dans le script, il pourrait me prendre beaucoup plus de temps à venir avec une solution qui fonctionne.
Re: Le système ne peut pas trouver le fichier – Difficile de dire quoi que ce soit sans au moins avoir un coup d'oeil à ces fichiers par lots. Fait ce script se comporte de la même manière?
Une chose de plus, juste au cas où vous ne sont pas conscients. Les variables de boucle dans les fichiers de commandes sont sensibles à la casse. Donc, si vous êtes l'extension de la en surbrillance dans la liste, assurez-vous que tout le var noms sont minuscules.
OriginalL'auteur Andriy M
Je sais que c'est une vieille question, mais ce type de question est mon préféré il est donc ici ma réponse:
Ce programme ont pas de limite dans le nombre de champs. Cette version nécessite de les placer dans des citations les éléments qui peuvent avoir des espaces ou d'autres Lot de séparateurs, mais cette restriction peut être facilement corrigé.
Les délimiteurs standard pour un Lot de fichier de paramètres et POUR les ensembles peuvent être la virgule, point-virgule, signe égal (sans espaces), donc il n'y a pas de nécessité explicitement vérifier les virgules. Cependant, cela peut être un problème si les titres ou les éléments peuvent avoir ces caractères (comme je l'ai écrit dans ma réponse).
Je viens de faire quelques tests simples avec des chaînes de caractères contenant des virgules, et il a travaillé de nice! Ne savais pas que la (non-échappé) les virgules sont traités dans le
IN()
clause de la même manière que des espaces, merci!OriginalL'auteur Aacini
Python qui rend ce si facile qu'il devrait être réglementé par le gouvernement.
Edit: je suppose que vous avez besoin de quelque chose de maternelle à l'invite de commandes Windows. Oh bien.
OriginalL'auteur Chris
OriginalL'auteur Benny