Como ler valores em uma coluna específica de um arquivo CSV em Lote?

1

Estou planejando escrever um script em lote no qual preciso varrer os valores de uma determinada coluna de um arquivo CSV, um a um, e armazená-los em uma variável para processamento posterior.

Digamos que o seguinte seja o arquivo CSV:

A1 B1 C1 D1 E1
A2 B2 C2 D2 E2
A3 B3 C3 D3 E3
.. .. .. .. ..

Eu tenho que ler D1, executar um comando usando seu valor, ler D2, executar um comando e assim por diante.

Como isso pode ser alcançado?

    
por Mandar Shinde 28.03.2014 / 12:56

4 respostas

1

Suponha que você tenha um arquivo delimitado por espaço chamado seuarquivo.csv , e deseja ler a quarta coluna (D1), você deve executar isto:

for /F "tokens=4 delims= " %i in (yourfile.csv) do @echo %i
    
por 28.03.2014 / 13:25
1

No windows 7 com powershell você pode facilmente analisar o csv com Import-Csv EX:

Import-Csv -Delimiter " " -Header a,b,c,d,e c:\the.csv | foreach{ Write-Host $_.d }
    
por 28.03.2014 / 13:16
0

Aqui está um arquivo em lote que eu escrevi para despejar uma lista de todos os meus usuários de domínio (vários milhares) em um arquivo, um nome de usuário por arquivo (a ordem não é importante). Como o comando "net group" despeja a lista de usuários em THREE colunas (largura fixa), usei a sintaxe "token" no seguinte arquivo em lote para fazer isso.

@echo off
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
REM Turns three-column output from NET GROUP command into a 
REM single column of domain usernames
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
SET NGCSV=UserList3Col.csv
SET NGCSVT1=UserList3Col.csv.temp1
SET NGCSVT2=UserList3Col.csv.temp2
SET NGFINAL=UserListFinal.txt
setlocal EnableDelayedExpansion
net group /domain "Domain Users" > %NGCSV%
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
REM Now strip out the crap
REM ...make a temporary copy
COPY %NGCSV% %NGCSVT2%
REM ...strip off the crap using alternating temp files
findstr /B /L /V /C:"The request" %NGCSVT2% > %NGCSVT1%
findstr /B /L /V /C:"Group name" %NGCSVT1% > %NGCSVT2%
findstr /B /L /V /C:"Comment" %NGCSVT2% > %NGCSVT1%
findstr /B /L /V /C:"Members" %NGCSVT1% > %NGCSVT2%
findstr /B /L /V /C:"-----" %NGCSVT2% > %NGCSVT1%
findstr /B /L /V /C:"The command" %NGCSVT1% > %NGCSVT2%
REM ...make the last temporary copy the final copy and clean up
COPY %NGCSVT2% %NGCSV%
DEL %NGCSVT1%
DEL %NGCSVT2%
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
REM Now convert it all to one column
del %NGFINAL%
REM ...Column 1
for /F "tokens=1" %%A in (%NGCSV%) do @echo %%A >> %NGFINAL%
REM ...Column 2
for /F "tokens=2" %%A in (%NGCSV%) do @echo %%A >> %NGFINAL%
REM ...Column 3
for /F "tokens=3" %%A in (%NGCSV%) do @echo %%A >> %NGFINAL%

(Observe que os caracteres "!" em nomes de usuários não são tratados por esse arquivo em lote, mas isso não me afetou.)

Eu também recomendo usar este artigo: link ... para saber mais sobre como os delimitadores são tratados.

    
por 18.08.2014 / 19:54
-1

Confira as respostas nesta pergunta ... Não é exatamente o mesmo, mas vai analisar um arquivo csv em um script em lote:

link

    
por 28.03.2014 / 13:39