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