Questione : Come leggere un CSV using la linea di ordine di Windows

Per bassicly una lima orientata l'applicazione devo redigere alcune procedure. Una di loro legge una lima del csv e scrive altre due lime basate sulle informazioni nel primo contence di file.
De dell'archivio di entrata è come: il

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

The PER l'ordine che sto usando sta avendo difficoltà con il campo vuoto (quarto) nell'ultima linea. L'azione di scrittura (eco nel frammento) è fatta secondo i 3 o i 9 nell'ultimo campo. Ora il campo 4 è campo vuoto 4 arriverà al valore del campo 5.
Is un senso impedire questo beheavior del PER l'ordine?

Thanks in avanzato!
John
class= > " libero " del
> " del codeSnippet " del class= del
class= " lineNumbers " del
class= del
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= " del id= " codeSnippet837878 del
:: Generazione del gruppo del custode
::  9 = KB
::  3 = ABN
:: ******************************************************
: create_custodian_group
  
  PER /F “delims= di skip=1 tokens=1,2,3,4,5,„ %%G dentro (%a_vanvec%vecacc.csv) fanno (
    chiamata: s_write_group %%G %%H “%%I„ “%%J„ %%K)
  DI AVANZAMENTO: einde
  
: s_write_group

se non == [di %5] [3] (
  se non == [di %5] [9] (
    l'eco 1=%1 2=%2 3=%3 4=%4 5=%5 fa torto al codice
  ) altrimenti (
    eco Kb = %1 - %5
  )
) abn altro di eco = %1 - %5

:: conclusione del sottoprogramma
  DI AVANZAMENTO: eof

: einde
pausa
class= del

Risposta : Come leggere un CSV using la linea di ordine di Windows

Ci non è alcun senso dire PER l'ordine non trattare i delims successivi come singolo delim.  Il senso che lavoro tipicamente intorno a questo è “pre di procedare„ la linea di entrata e di cercare gli accoppiamenti dei delims con niente fra loro.  Sostituisco questi con qualcosa fra i delims che posso allora controllare per vedere se c'è nel codice e trattare come un valore mancante o vuoto.

Così se la linea di entrata fosse

aaa, bbb

E voglio procedare i 4 valori piuttosto che i 2 a che PER la raccolta di volontà per difetto, quindi io in primo luogo convertire la linea

aaa, @, @, bbb

ed allora inserire quello nel PER ed analizzare sul virgola.

Sto attaccando il codice con questo cambiamento, lo lascio so va per voi.  Ho proceduto a una coppia di altre piccole registrazioni, lo lascio conosco che domande avete.

- necessario aggiungere il EnableDelayedExpansion setlocal in modo che possa aggiornare ed usare una variabile all'interno di un ciclo

- ha definito il nome di schedario dell'input come variabile e lo ha citato principalmente PER quello lo legge, per trattare il caso dove il nome di schedario potrebbe comprendere gli spazi

- l'esterno PER il ciclo legge l'intera linea, quindi assegniamo quello ad una variabile in moda da poterli sostituire noi i valori “vuoti„ con un placeholder (ho usato @, potrei essere qualche cosa che gradiciate)

- allora un altro PER tanto come vostro originale analizza la stringa risultante e denomina il sottoprogramma

- Ho aggiunto un ECO del inputline prima e dopo la conversione che appena così potete vedere come funziona, queste sarebbe stato rimosso più successivamente

Sperare che questo aiuti

~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 fuori
EnableDelayedExpansion setlocal
 
Rem che genera il gruppo del custode
REM  9 = KB
REM  3 = ABN
****************************************************** di rem
regolare InputFile=%a_vanvec%vecacc.csv
 
: create_custodian_group
  
per /F “il tokens=*„ %%A del usebackq skip=1 in ("%InputFile%") fare (
  regolare InputLine=%%A
  eco PRIMA: ! InputLine!
  per /L %%B dentro (1.1.20) fare (
    regolare InputLine=! InputLine: , =, @!
  )
  eco DOPO: ! InputLine!
  per /F “delims= di tokens=1-5,„ %%G dentro ("! InputLine! ") fare (
    chiamata: s_write_group %%G %%H “%%I„ “%%J„ %%K
  )
)
DI AVANZAMENTO: einde
  
: s_write_group
  se non == [di %5] [3] (
    se non == [di %5] [9] (
      l'eco 1=%1 2=%2 3=%3 4=%4 5=%5 fa torto al codice
    ) altrimenti (
      eco Kb = %1 - %5
    )
  ) altrimenti (
    abn di eco = %1 - %5
  )
 
  Conclusione di rem del sottoprogramma
  DI AVANZAMENTO: eof
 
: einde
  pausa
Altre soluzioni  
 
programming4us programming4us