在批处理文件中搜索 .csv

在批处理文件中搜索 .csv

我希望创建一个批处理文件,它将在 .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.**

我知道这非常模糊,但如果能得到任何指导我将非常感激。

谢谢你!

答案1

非常容易通过批处理完成。

@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 列值中的逗号仍然很棘手。

答案2

我个人认为你应该从批处理切换到 powershell 来做这件事,解析 csv 就像使用匯入-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.

答案3

使用批处理和 PowerShell 可能会得到一些有趣的答案,所以我将尝试使用 VBS。将此文件命名为 test.vbs,并将其放在与 Store 和 IP 文件相同的目录中。在我的情况下,我将其命名为 test.csv。要运行它

c:\> cscript /nologo 测试.vbs 2000
192.168.1.2
c:\> cscript /nologo 测试.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

相关内容