1

Я планирую написать пакетный скрипт, в котором мне нужно один за другим сканировать значения из определенного столбца файла CSV и сохранять их в переменной для дальнейшей обработки.

Скажем, следующий файл CSV:

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

Я должен прочитать D1, выполнить команду, используя ее значение, прочитать D2, выполнить команду и так далее.

Как этого достичь?

4 ответа4

1

В Windows 7 с PowerShell вы можете легко проанализировать CSV с помощью Import-Csv EX:

Import-Csv -Delimiter " " -Header a,b,c,d,e c:\the.csv | foreach{ Write-Host $_.d }
1

Предположим, у вас есть файл с разделителем пробелом с именем yourfile.csv, и вы хотите прочитать четвертый (D1) столбец, вам нужно выполнить это:

for /F "tokens=4 delims= " %i in (yourfile.csv) do @echo %i
0

Вот пакетный файл, который я написал, чтобы выгрузить список всех пользователей моего домена (несколько тысяч) в файл, по одному имени пользователя на файл (порядок не важен). Поскольку команда "net group" выводит список пользователей в ТРИ столбца (фиксированная ширина), я использовал для этого синтаксис "токен" в следующем пакетном файле.

@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%

(Обратите внимание, что "!"символы в именах пользователей не обрабатываются этим пакетным файлом, но это не повлияло на меня.)

Я также рекомендую использовать эту статью:http://www.robvanderwoude.com/ntfortokens.php ... чтобы узнать больше о том, как обрабатываются разделители.

-1

Проверьте ответы на этот вопрос ... Это не совсем то же самое, но он разбирает CSV-файл в пакетном скрипте:

https://stackoverflow.com/questions/17473239/windows-batch-programming-reading-from-a-csv-file-and-extracting-certain-data

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .