Я ищу, чтобы создать пакетный файл, который будет искать в CSV для определенного числа, а затем использовать 2-е значение в CSV в качестве ввода обратно в пакетный файл.

Пример:

имя CSV = IP.csv

Пример .csv

Store,IP
1000,192.168.1.1
2000,192.168.1.2
3000,192.168.1.3
4000,192.168.1.4
5000,192.168.1.5

Пакетный пример

Set /p Store=Enter the Store number:

**Search the .csv for the store number, then reply with the IP address.**

Я знаю, что это очень расплывчато, но любое руководство будет с благодарностью.

Спасибо!

3 ответа3

3

Очень легко сделать с помощью партии.

@echo off
setlocal
set /p "store=Enter the store number: "
for /f "tokens=2 delims=," %%A in ('findstr /r "^%store%," "ip.csv"') do echo %%A

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

Я написал гибридную утилиту JScript/batch под названием REPL.BAT, которая также может быстро справиться с этой проблемой. Он выполняет поиск и замену регулярных выражений в stdin и записывает результат в stdout. Это чистый скрипт, который запускается на любой машине с Windows начиная с XP - загрузка exe не требуется. REPL.BAT доступен здесь. , Полная документация встроена в скрипт.

REPL.BAT имеет множество вариантов, в том числе тот, который записывает только измененные строки, что делает его идеальным для этой проблемы. Предполагая, что REPL.BAT находится в вашем текущем каталоге или, что еще лучше, где-то в вашем PATH:

@echo off
setlocal
set /p "store=Enter the store number: "
type ip.csv|repl "^%store%,(.*)" $1 a

REPL.BAT устраняет многие сложности при работе с текстовыми файлами в пакетном режиме. Но работать с запятыми в значениях столбцов CSV все еще сложно.

1

Лично я думаю, что вы должны переключиться с пакетной на PowerShell, чтобы сделать это, анализ CSV так же просто, как с помощью команды Import-CSV

$storeTable = Import-CSV IP.csv

#build a hashtable from the data we imported so we can do easy lookups.
$storeLookup= @{}
foreach($r in $storeTable)
{
    $storeLookup[$r.Store] = $r.IP
}

$storeNumber= Read-Host "Enter the Store number:"
$storeIp = $storeLookup[$storeNumber]

#stop the script if no valid IP was provided
if($storeIp -eq $null)
    Return

#use $storeIp in the rest of the script to reference the ip address.
0

Вы можете получить некоторые интересные ответы, используя пакетные и PowerShell, поэтому я попробую VBS. Назовите этот файл test.vbs и поместите его в тот же каталог, что и ваши файлы с Store и IP. В моем случае я назвал это test.csv. Запустить его

c:\> cscript /nologo test.vbs 2000
192.168.1.2
c:\> cscript /nologo test.vbs 1000
192.168.1.1

Вот сценарий. Это выглядит долго из-за всех комментариев.

' test.csv sample:
'Store,IP
'1000,192.168.1.1
'2000,192.168.1.2
'3000,192.168.1.3
'4000,192.168.1.4
'5000,192.168.1.5

' Usage: 
' g:\> cscript /nologo test.vbs 1000
' will return 192.168.1.1

option explicit

' let's create a file system object to read file
dim fs
set fs = CreateObject("Scripting.FileSystemObject")

' let's define where the file sits
dim fil
set fil = fs.OpenTextFile("test.csv")

' let's count line numbers. Knowing that first line is for headers
' we know that we have to skip that line
dim counter, line, arr
counter = 0

' let's read line by line of the file
do while not fil.AtEndOfStream

    ' capture line and change the counter 
    line = fil.ReadLine
    counter = counter + 1

    ' only process data if we are past the first line. First line
    ' contains header anyway
    if counter > 1 then

        ' break the line into pieces. We know that each piece is separated by a comma
        ' e.g. 1000, 127.0.0.1
        arr = split(line, ",")

        ' Now arg will have two pieces. Assuming the example of 1000, 127.0.0.1
        ' arr(0) will be 1000 and
        ' arr(1) will be 127.0.0.1
        ' Let's compare arr(0) to the first command line argument to this program
        ' and return the corresponding arr(1) if there's a match
        if arr(0) = WScript.Arguments.Item(0) then
            WScript.Echo arr(1)
        end if

    end if
loop

' cleanup
fil.close
set fil = nothing
set fs = nothing

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