배치 파일 내에서 .csv 검색


0

.csv에서 특정 숫자를 검색하는 배치 파일을 만든 다음 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.**

나는 이것이 매우 모호하다는 것을 알고 있지만 모든 지침은 크게 감사하겠습니다.

감사합니다!


findstr당신을 시작해야합니다.
Der Hochstapler

Ewww, 배치? 특정 이유 배치가 있습니까? PowerShell은 실제로 2013 년의 Windows 모범 사례입니다.
Austin T French

나는 배치를 사용해야 할 이유가 없다고 생각합니다. 파워 쉘이 더 나은 대안이 될 것입니다. 그러나 powershell을 시작할 위치에 대한 단서가 없으며 현재 배치에 ~ 650 줄이 작성되어 있습니다.
user2596575

답변:


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 레이아웃이 변경되면 일괄 처리에 문제가 훨씬 더 복잡해질 수 있습니다. 예를 들어 열 값의 쉼표는 해결하기 위해 더 많은 코드가 필요한 문제를 만듭니다.

REPL.BAT라는 하이브리드 JScript / 배치 유틸리티를 작성하여이 문제를 간단히 해결할 수 있습니다. stdin에서 정규식 검색 및 바꾸기를 수행하고 결과를 stdout에 씁니다. XP 이후의 모든 Windows 시스템에서 실행되는 순수한 스크립트이며 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 열 값 내에서 쉼표를 처리하는 것은 여전히 ​​까다 롭습니다.


정말 고맙습니다! 현재 배치 파일에 쉽게 구현할 수 있도록 REPL.BAT 권장 사항과 함께 사용했습니다.
user2596575

1

개인적으로 CSV를 파싱하는 것은 Import-CSV 명령 을 사용하는 것만 큼 간단합니다 .batch에서 powershell로 전환해야한다고 생각합니다.

$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.

이것은 내가 게시 한 것과 정확히
Austin T French

@ user2596575 이제 Set을 사용하고있는 것을 이해하면 스크립트처럼 작동하여 상점 번호를 묻는 메시지가 표시됩니다.
Scott Chamberlain

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.