Frage : Wie man ein CSV using Windows-Befehlszeile liest

Für eine bassicly orientierte Akte Anwendung muss ich einige Verfahren schreiben. Eins von ihnen liest eine csv Akte und schreibt zwei andere Akten, die nach den Informationen in das erste file.
De contence der Eingangsakte gegründet werden, ist wie:

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

The FÜR Befehl, den ich verwende, hat Mühe mit dem leeren Feld (Viertel) in der letzten Linie. Die schreibentätigkeit (Echo im Stückchen) ist abhängig von den 3 oder den 9 im letzten Feld erfolgt. Jetzt ist Feld 4 leeres Feld 4 kommt dem Wert des Feldes 5.
Is dorthin eine Weise, dieses beheavior von FÜR Befehl zu verhindern?

Thanks in vorgerücktem!
John
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:
:: Schaffung der Hausmeistergruppe
::  9 = KB
::  3 = ABN
:: ******************************************************
: create_custodian_group
  
  FÜR /F „skip=1 tokens=1,2,3,4,5 delims=,“ tun %%G innen (%a_vanvec%vecacc.csv) (
    Anruf: s_write_group %%G %%H „%%I“ „%%J“ %%K)
  GOTO-: einde
  
: s_write_group

wenn nicht [%5] == [3] (
  wenn nicht [%5] == [9] (
    Echo 1=%1 2=%2 3=%3 4=%4 5=%5 schaden Code
  ) sonst (
    Echo KB = %1 - %5
  )
) sonst Echo abn = %1 - %5

:: Ende der Subroutine
  GOTO-: EOF

: einde
Pause

Antwort : Wie man ein CSV using Windows-Befehlszeile liest

Es gibt keine Weise, FÜR Befehl zu erklären, nachfolgende delims nicht als einzelnes delim zu behandeln.  Die Weise, die ich gewöhnlich um dieses bearbeite, ist, „vor die Eingangslinie zu verarbeiten“ und Paaren nach delims mit nichts zwischen ihnen zu suchen.  Ich ersetze diese durch etwas zwischen den delims, die ich auf im Code dann überprüfen und als fehlender oder leerer Wert behandeln kann.

So, wenn die Eingangslinie war

aaa, bbb

Und ich möchte 4 Werte eher als die 2 verarbeiten, denen FÜR Willensaufnahme durch Rückstellung, dann ich zuerst umwandeln die Linie zu

aaa, @, @, bbb

und das in FÜR dann einziehen und auf Komma analysieren.

Ich anbringe den Code mit dieser Änderung, lasse mich kann h, sie für Sie geht.  Ich vornahm ein paar andere kleine Justagen, lasse mich weiß ch, welche Fragen Sie haben.

- erforderlich das setlocal EnableDelayedExpansion addieren, damit ich eine Variable innerhalb einer Schleife aktualisieren und verwenden konnte

- definierte den Eingangsdateinamen als Variable und veranschlug ihn in der Hauptleitung FÜR den liest es, um den Fall zu behandeln, in dem der Dateiname Räume umfassen könnte

- das äußere FÜR Schleife liest die gesamte Linie, dann zuweisen wir das einer Variable s, damit wir können die „leeren“ Werte durch einen Placeholder (mich verwendete @, könnte aller sein, den Sie mögen), ersetzen

- dann analysiert anders FÜR ganz wie Ihr ursprüngliches die resultierende Schnur und benennt die Subroutine

- Ich hinzufügte ein ECHO des inputline Echo, bevor und nachdem die Umwandlung, die gerade so Sie sehen können, wie es funktioniert, diese, entfernt später

Hoffen, dass dieses hilft

~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:
6:
37:
38:
39:
40:
@echo weg
setlocal EnableDelayedExpansion
 
Rem Hausmeistergruppe verursachend
REM  9 = KB
REM  3 = ABN
Rem ******************************************************
InputFile=%a_vanvec%vecacc.csv einstellen
 
: create_custodian_group
  
für /F „usebackq skip=1 tokens=*“ %%A innen („%InputFile%") tun (
  InputLine=%%A einstellen
  Echo VORHER: ! InputLine!
  für /L %%B (1.1.20) innen tun (
    InputLine= einstellen! InputLine: , =, @!
  )
  Echo NACHHER: ! InputLine!
  für /F „tokens=1-5 delims=,“ %%G innen („! InputLine! ") tun (
    Anruf: s_write_group %%G %%H „%%I“ „%%J“ %%K
  )
)
GOTO-: einde
  
: s_write_group
  wenn nicht [%5] == [3] (
    wenn nicht [%5] == [9] (
      Echo 1=%1 2=%2 3=%3 4=%4 5=%5 schaden Code
    ) sonst (
      Echo KB = %1 - %5
    )
  ) sonst (
    Echo abn = %1 - %5
  )
 
  Rem-Ende der Subroutine
  GOTO-: EOF
 
: einde
  Pause
Weitere Lösungen  
 
programming4us programming4us