Vraag : Hoe te om een CSV te lezen gebruikend de Lijn van het Bevel van Vensters

Voor een bassicly dossier georiënteerde toepassing moet ik sommige procedures schrijven. Één van hen leest een csvdossier en schrijft twee andere die dossiers op de informatie in eerste/>De contence file.

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

The VOOR bevel ik heb probleem met het lege gebied (vierde) in de laatste lijn gebruik. Schrijf de actie (echo in het fragment) afhankelijk van 3 of 9 op het laatste gebied wordt gedaan. Nu gebied 4 leeg gebied 4 zal worden daar de waarde van gebied 5.
Is een manier is om dit beheavior van VOOR bevel te verhinderen?

Thanks vooraf!
John
" codeBody "
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:
" notpretty "
:: Het creëren van beheerdergroep
::  9 = KB
::  3 = ABN
:: ******************************************************
: create_custodian_group
  
  VOOR /F „skip=1 tokens=1,2,3,4,5 delims=,“ %%G binnen (%a_vanvec%vecacc.csv) (
    vraag: s_write_group %%G %%H „%%I“ „%%J“ %%K)
  GOTO: einde
  
: s_write_group

als niet [%5] == [3] (
  als niet [%5] == [9] (
    echo 1=%1 2=%2 3=%3 4=%4 5=%5 verkeerde code
  ) anders (
    echo KB = %1 - %5
  )
) anders echo abn = %1 - %5

:: eind van subroutine
  GOTO: eof

: einde
pauze

Antwoord : Hoe te om een CSV te lezen gebruikend de Lijn van het Bevel van Vensters

Er is niet om het even welke manier vertellen VOOR bevel om opeenvolgende delims als één enkele delim niet te behandelen.  Manier I werkt typisch rond dit is „preproces“ de inputlijn en zoekt paren delims met niets tussen hen.  Ik vervang deze met iets binnen - tussen delims ik dan waarin de code kan controleren en als het missen of lege waarde behandelen.

Zo als de inputlijn was

aaa, bbb

En ik wil 4 waarden eerder dan 2 verwerken waarVOOR bestelwagen door gebrek, dan de bekeerling van I eerste de lijn aan zal

aaa, @, @, bbb

en toen ontleedt het voer dat in VOOR en op komma.

Ik maak de code met deze verandering vast, liet me weten hoe het voor u gaat.  Ik maakte een paar andere kleine aanpassingen, liet me weten welke vragen u hebt.

- moest setlocal EnableDelayedExpansion toevoegen zodat ik een variabele binnen een lijn bijwerken en kon gebruiken

- defini�ërde het inputdossier - naam als variabele, en citeerde het in de leiding VOOR dat leest het, om het geval te behandelen waar filename ruimten kon omvatten

- buiten VOOR lijn leest de volledige lijn, dan wijzen wij dat aan een variabele toe zodat wij de „lege“ waarden met placeholder (ik gebruikte @, zou kunnen om het even wat zijn u houdt van) kunnen vervangen

- ontleedt een andere VOOR heel erg zoals uw originele dan het resulterende koord en roept de subroutine

- Ik voegde ECHO enkel van inputline before and after de omzetting toe zodat kunt u zien hoe het werkt, deze later worden verwijderd

Hoop dit helpt

~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 weg
setlocal EnableDelayedExpansion
 
Rem die beheerder tot groep leiden
REM  9 = KB
REM  3 = ABN
Rem ******************************************************
vastgestelde InputFile=%a_vanvec%vecacc.csv
 
: create_custodian_group
  
voor /F „usebackq skip=1 tokens=*“ %%A binnen („%InputFile%“) (
  vastgestelde InputLine=%%A
  echo VÓÓR: ! InputLine!
  voor /L %%B binnen (1.1.20) (
    plaats InputLine=! InputLine: , =, @!
  )
  echo NA: ! InputLine!
  voor /F „tokens=1-5 delims=,“ %%G binnen („! InputLine! “) (
    vraag: s_write_group %%G %%H „%%I“ „%%J“ %%K
  )
)
GOTO: einde
  
: s_write_group
  als niet [%5] == [3] (
    als niet [%5] == [9] (
      echo 1=%1 2=%2 3=%3 4=%4 5=%5 verkeerde code
    ) anders (
      echo KB = %1 - %5
    )
  ) anders (
    echo abn = %1 - %5
  )
 
  Het eind van rem van subroutine
  GOTO: eof
 
: einde
  pauze
Andere oplossingen  
 
programming4us programming4us