Question : Comment lire un CSV using la ligne de commande de Windows

Pour une application bassicly à base de fichier je dois écrire quelques procédures. L'une d'entre elles lit un dossier de csv et écrit deux autres dossiers basés sur l'information dans le premier contence de file.
De du dossier d'entrée est comme : le

#, 6/29/2010, le
222857293,2857293, V.E.C. Klanta, en/of V.E.C. Klantc, 3
223509302,3509302, V.E.C.Klantb, 9

The POUR la commande que j'emploie a des ennuis avec le champ vide (quart) dans la dernière ligne. L'action d'inscription (écho dans l'extrait) est faite selon les 3 ou les 9 dans le dernier domaine. Maintenant le champ 4 est le champ vide 4 y arrivera à la valeur du champ 5.
Is une manière d'empêcher ce beheavior de POUR la commande ?

Thanks dans avancé !
John
class= > " clair " de
> de " codeSnippet " de class= de
class= " lineNumbers " de
class= de
1 :
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
class= " de l'id= " codeSnippet837878 de
 : : Création du groupe de gardien
: :  9 = KB
: :  3 = ABN
: : ******************************************************
: create_custodian_group
  
  POUR /F « delims= de skip=1 tokens=1,2,3,4,5, » %%G dedans (%a_vanvec%vecacc.csv) font (
    appel : s_write_group %%G %%H « %%I » « %%J » %%K)
  GOTO : einde
  
: s_write_group

sinon [== de %5] [3] (
  sinon [== de %5] [9] (
    l'écho 1=%1 2=%2 3=%3 4=%4 5=%5 font du tort le code
  ) autrement (
    écho KB = %1 - %5
  )
) abn d'autre d'écho = %1 - %5

: : fin de sous-routine
  GOTO : EOF

: einde
pause
class= de

Réponse : Comment lire un CSV using la ligne de commande de Windows

Il n'y a pas aucune manière de dire POUR la commande de ne pas traiter les delims consécutifs comme delim simple.  La manière que je travaille typiquement autour de ceci est « pré de traiter » la ligne d'entrée et de rechercher des paires de delims avec rien entre eux.  Je remplace ces derniers par quelque chose entre les delims que je peux alors vérifier dans le code et traiter comme valeur absente ou vide.

Ainsi si la ligne d'entrée était

D.C.A., bbb

Et je veux traiter 4 valeurs plutôt que les 2 aux lesquels POUR la collecte de volonté par défaut, puis moi convertir d'abord la ligne

D.C.A., @, @, bbb

et alors introduire cela dans POUR et analyser sur la virgule.

J'attache le code avec ce changement, me laisse sais il va pour vous.  J'ai fait deux ou trois autres petits ajustements, me laisse sais quelles questions vous avez.

- nécessaire pour ajouter l'EnableDelayedExpansion setlocal de sorte que j'aie pu mettre à jour et employer une variable à l'intérieur d'une boucle

- a défini le nom de fichier d'entrée comme variable, et l'a cité principalement POUR cela le lit, pour traiter le cas où le nom de fichier pourrait inclure les espaces

- l'externe POUR la boucle lit la ligne entière, puis nous assignons cela à une variable de sorte que nous puissions remplacer les valeurs « vides » par un texte d'attente (j'ai employé @, pourrais être quelque chose que vous aimez)

- alors un autre POUR tout comme votre original analyse la corde résultante et appelle la sous-routine

- J'ai ajouté un ÉCHO de l'inputline avant et après que la conversion que juste ainsi vous pouvez voir comment cela fonctionne, ceux-ci soit enlevé plus tard

Espérer que ceci aide

~bp
1 :
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
32 :
33 :
34 :
35 :
36 :
37 :
38 :
39 :
40 :
@echo au loin
EnableDelayedExpansion setlocal
 
Rem créant le groupe de gardien
REM  9 = KB
REM  3 = ABN
****************************************************** de rem
placer InputFile=%a_vanvec%vecacc.csv
 
: create_custodian_group
  
pour /F le « tokens=* de l'usebackq skip=1 » %%A dans ("%InputFile%") faire (
  placer InputLine=%%A
  écho AVANT : ! InputLine !
  pour /L %%B dedans (1.1.20) faire (
    placer InputLine= ! InputLine : , =, @ !
  )
  écho ENSUITE : ! InputLine !
  pour /F « delims= de tokens=1-5, » %%G dedans (" ! InputLine ! ") faire (
    appel : s_write_group %%G %%H « %%I » « %%J » %%K
  )
)
GOTO : einde
  
: s_write_group
  sinon [== de %5] [3] (
    sinon [== de %5] [9] (
      l'écho 1=%1 2=%2 3=%3 4=%4 5=%5 font du tort le code
    ) autrement (
      écho KB = %1 - %5
    )
  ) autrement (
    abn d'écho = %1 - %5
  )
 
  Fin de rem de sous-routine
  GOTO : EOF
 
: einde
  pause
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us