Batch file 在批处理文件中,我希望将变量(字符串)与设置模式进行比较,并返回一个数值
我对编程有点陌生,我决定尝试制作一个交互式表单,为我在学校的sql课堂创建一个平面文件数据库,可以通过设置的任务加载到sql server中 我有一个.txt文件,它是数据库的平面文件 以平面文件为例,每个列之间用分隔符分隔;下线为:Batch file 在批处理文件中,我希望将变量(字符串)与设置模式进行比较,并返回一个数值,batch-file,cmd,Batch File,Cmd,我对编程有点陌生,我决定尝试制作一个交互式表单,为我在学校的sql课堂创建一个平面文件数据库,可以通过设置的任务加载到sql server中 我有一个.txt文件,它是数据库的平面文件 以平面文件为例,每个列之间用分隔符分隔;下线为: ID;FName;LName;FavColor;Gender: 1;Scott;Muhlestein;Silver;Male: 我已将文件内容导入内存,每一行都是不同的%var#%,我想将%var1%(作为数据库的标题)与如下所示的模式进行比较: A#C=任
ID;FName;LName;FavColor;Gender:
1;Scott;Muhlestein;Silver;Male:
我已将文件内容导入内存,每一行都是不同的%var#%,我想将%var1%(作为数据库的标题)与如下所示的模式进行比较:
A#C=任意字符
if %var1%==(A#C);(A#C);(A#C);(A#C): set colnum=4
if %var1%==(A#C);(A#C);(A#C): set colnum=3
if %var1%==(A#C);(A#C): set colnum=2
当前最大colnum=10
模式是以分号分隔并以冒号结尾的任意数量的字符
一旦我有了这个新变量(colnum),我就可以在用户尝试添加新记录时将条目数限制为正确的数量
有什么想法或它们是更好的方法吗?除了计数检查之外,您甚至可以使用
findstr
进行语法检查:
echo %var#%|findstr /i "[0-9]*;[a-z]*;[a-z]*;[a-z]*:$" >nul &&echo correct||echo sorry, wrong Input
检查是否有数字,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟一串字母,后跟冒号,后跟“字符串末尾”
稍微适应“Müller”(除26个字母外)或“Brown Smith”(破折号)或“Mc Scott”(空格)等名字
一些黑暗的东西可能是对的,我误解了这个问题
如果只需要列数:
set "colnum="
for %%i in (%var#%) do set /a colnum +=1
echo number of entries: %colnum%
if "%var#:~-1%" neq ":" echo you forgot the colon
除了计数检查之外,您甚至可以使用
findstr
进行语法检查:
echo %var#%|findstr /i "[0-9]*;[a-z]*;[a-z]*;[a-z]*:$" >nul &&echo correct||echo sorry, wrong Input
检查是否有数字,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟一串字母,后跟冒号,后跟“字符串末尾”
稍微适应“Müller”(除26个字母外)或“Brown Smith”(破折号)或“Mc Scott”(空格)等名字
一些黑暗的东西可能是对的,我误解了这个问题
如果只需要列数:
set "colnum="
for %%i in (%var#%) do set /a colnum +=1
echo number of entries: %colnum%
if "%var#:~-1%" neq ":" echo you forgot the colon
@ECHO关闭
SETLOCAL
对于%%a IN(
“(A#C);(A#C);(A#C);(A#C):”
“(A#C);(A#C);(A#C):”
“(A#C);(A#C):”
“(A#C);(A#C):”
(A#C);(A#C);(A#C);(A#C)注意不要用冒号结尾
)设置“var=%%~a”&调用:countcols
后藤:EOF
:countcols
设置“workvar=”
设置/a计数=0
如果“%var:~-1%”=(
设置“workvar=%var%”
设置/a计数=1
)
:countloop
如果定义了workvar(
如果“%workvar:~0,1%”设置/a计数+=1
设置“workvar=%workvar:~1%”
转到计数环
)
回显“%var%”包含%count%列
后藤:EOF
这里有一个小演示
第一部分简单地将var
设置为其中一个字符串(~
删除包含的引号)并执行countcols
子例程
countcols
首先确保workvar
被“设置”为空,并且count
被设置为0
然后,如果var
的最后一个字符是冒号,则将workvar
设置为var
的值,并将count
设置为1
然后,如果定义了workvar
,它将检查第一个字符,如果是分号,则计数1。然后,它将删除第一个字符
重复此操作直到workvar
为空(因此未定义)
然后创建一个报告作为演示
有关批处理子字符串的详细信息,请参见
set /?
从提示符处。@ECHO OFF
@echo off
setlocal
rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt
rem Count the number of fields separated by ; (or space, comma or equal-sign)
set colnum=0
for %%a in (%var1%) do set /A colnum+=1
echo colnum = %colnum%
SETLOCAL
对于%%a IN(
“(A#C);(A#C);(A#C);(A#C):”
“(A#C);(A#C);(A#C):”
“(A#C);(A#C):”
“(A#C);(A#C):”
(A#C);(A#C);(A#C);(A#C)注意不要用冒号结尾
)设置“var=%%~a”&调用:countcols
后藤:EOF
:countcols
设置“workvar=”
设置/a计数=0
如果“%var:~-1%”=(
设置“workvar=%var%”
设置/a计数=1
)
:countloop
如果定义了workvar(
如果“%workvar:~0,1%”设置/a计数+=1
设置“workvar=%workvar:~1%”
转到计数环
)
回显“%var%”包含%count%列
后藤:EOF
这里有一个小演示
第一部分简单地将var
设置为其中一个字符串(~
删除包含的引号)并执行countcols
子例程
countcols
首先确保workvar
被“设置”为空,并且count
被设置为0
然后,如果var
的最后一个字符是冒号,则将workvar
设置为var
的值,并将count
设置为1
然后,如果定义了workvar
,它将检查第一个字符,如果是分号,则计数1。然后,它将删除第一个字符
重复此操作直到workvar
为空(因此未定义)
然后创建一个报告作为演示
有关批处理子字符串的详细信息,请参见
set /?
从提示中
@echo off
setlocal
rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt
rem Count the number of fields separated by ; (or space, comma or equal-sign)
set colnum=0
for %%a in (%var1%) do set /A colnum+=1
echo colnum = %colnum%
编辑:添加新方法
如果任何标题包含通配符,则上一个技巧将失败:*?
。下面的解决方案允许在标题中使用特殊字符和通配符:
@echo off
setlocal EnableDelayedExpansion
rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt
rem Set maximum number of columns
set maxColnum=10
rem Count the number of fields separated by semicolon;
rem the fields may include other separators and wild-cards
set "str=%var1%;"
set colnum=0
for /L %%i in (1,1,%maxColnum%) do if defined str (
set /A colnum+=1
set "str=!str:*;=!"
)
echo colnum = %colnum%
@echo关闭
setlocal EnableDelayedExpansion
rem将第一行导入“var1”变量(您已经这样做了)
设置/P“var1=“
编辑:添加新方法
如果任何标题包含通配符,则上一个技巧将失败:*?
。下面的解决方案允许在标题中使用特殊字符和通配符:
@echo off
setlocal EnableDelayedExpansion
rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt
rem Set maximum number of columns
set maxColnum=10
rem Count the number of fields separated by semicolon;
rem the fields may include other separators and wild-cards
set "str=%var1%;"
set colnum=0
for /L %%i in (1,1,%maxColnum%) do if defined str (
set /A colnum+=1
set "str=!str:*;=!"
)
echo colnum = %colnum%
@echo关闭
setlocal EnableDelayedExpansion
rem将第一行导入“var1”变量(您已经这样做了)
设置/P“var1=“