Procura .csv de dentro de um arquivo de lote

0

Eu estou olhando para criar um arquivo em lotes que irá procurar um .csv para um número específico e, em seguida, use o segundo valor no csv como a entrada de volta para o arquivo em lotes.

Exemplo:

nome do csv = IP.csv

exemplo de .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

Exemplo de lote

Set /p Store=Enter the Store number:

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

Eu sei que isso é extremamente vago, mas qualquer orientação seria muito apreciada.

Obrigado!

    
por user2596575 06.08.2013 / 20:53

3 respostas

3

Muito facilmente feito com lote.

@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

O problema pode se tornar significativamente mais complicado para o lote se o layout do seu csv mudar. Por exemplo, as vírgulas nos valores das colunas criam problemas que exigem mais código para resolver.

Eu escrevi um utilitário híbrido JScript / batch chamado REPL.BAT que também poderia resolver o problema. Ele executa uma pesquisa em regex e substitui stdin e grava o resultado em stdout. É puro script que roda em qualquer máquina Windows do XP em diante - nenhum download exe é necessário. O REPL.BAT está disponível aqui. . A documentação completa está incorporada no script.

O REPL.BAT tem várias opções, incluindo uma que apenas grava linhas que são alteradas, tornando-a ideal para esse problema. Supondo que o REPL.BAT está no seu diretório atual, ou melhor ainda, em algum lugar no seu PATH:

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

O REPL.BAT elimina muitas complexidades do trabalho com arquivos de texto em lote. Mas lidar com vírgulas dentro de valores de coluna csv ainda é complicado.

    
por 07.08.2013 / 00:18
0

Você pode obter algumas respostas interessantes usando o lote e o PowerShell, por isso vou dar uma olhada na VBS. Nomeie esse arquivo como test.vbs e coloque-o no mesmo diretório dos arquivos com Store e IP. No meu caso eu chamei de test.csv. Para executá-lo

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

Aqui está o script. Parece longo por causa de todos os comentários.

' 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
    
por 06.08.2013 / 22:49