以下示例 - 5个文件将位于同一文件夹中。
Sales-fid1000-f100.dat
Revenue-fid1000-f100.dat
Sales-fid2000-f200.dat
Revenue-fid2000-f200.dat
Income-fid2000-f200.dat
我需要读取文件名并获取“fid”之后的数字,在本例中为1000和2000,并计算与每个“fid”相关联的文件数。
因此对于fid1000,有2个文件,对于fid2000,有3个文件。
我需要将输出写入.txt文件,如下所示,第一个字段是fid编号,第二个字段是计数。
1000|2
2000|3
如何使用Windows批处理文件生成带有fid和count的输出文本文件?
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
:: remove variables starting $
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*-fid*" '
) DO (
SET "filename=%%a"
CALL :process
)
(
FOR /F "tokens=1,2delims=$=" %%a In ('set $ 2^>Nul') DO ECHO(%%a^|%%b
)>"%outfile%"
GOTO :EOF
:process
SET "filename=%filename:*-fid=%"
FOR /f "delims=-" %%q IN ("%filename%") DO SET /a $%%q+=1
GOTO :eof
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
生成定义为%outfile%
的文件清除所有$
变量后(出于安全考虑),执行一个没有目录名的目录列表,以及与* -fid *匹配的源目录中的基本文件形式。
对于找到的每个名称,将名称指定给filename
并执行:process
例程,该例程首先删除-fid
中包含filename
的字符,然后使用delims=-
选项可将最初在-fid
和以下-
之间的部分分配给%%q
。
set
变量$%%q
加1(如果$ ??未定义,请指定1
)
最后,当处理完所有名称后,使用$...
列出名为set
的变量,生成样式报告
$1000=2
$2000=3
使用$
和=
作为分隔符,将令牌1(例如2000
)放入%%a
,将令牌2(例如3
)放入{{1} }。使用%%b
将这些写入输出,记住使用插入符号echo
来转义管道(|
)以将解释抑制为重定向器。
^
周围的括号可确保输出定向到指定的目标文件。
答案 1 :(得分:0)
将数字提取到临时文件中,然后计算该文件中每个数字的出现次数。
@echo off
setlocal EnableDelayedExpansion
>temp.txt type nul
set "unique_num="
for /f "tokens=2 delims=-" %%a in ('dir /b *.dat') do (
set "fid=%%a"
set "num=!fid:~3!"
>>temp.txt echo !num!
echo " !unique_num! " | find " !num! " >nul
if !errorlevel! neq 0 set "unique_num=!unique_num! !num!"
)
for %%n in (%unique_num%) do (
for /f "delims=: tokens=2" %%c in ('find /c "%%n" temp.txt') do (
set "count=%%c"
echo %%n^|!count: =!
)
)
del /f /q temp.txt
如果需要输出排序,请将结果传递到sort
。
答案 2 :(得分:0)
@echo off
setlocal EnableDelayedExpansion
rem Process all file names
for /F "tokens=2 delims=-" %%a in ('dir /B /A-D *.dat') do (
rem Get FID from second dash-delimited token; format: "xxx-fid####-xxx.dat"
set "fid=%%a"
rem Accumulate it to the corresponding element of "count" array
set /A "count[!fid:~3!]+=1"
)
rem Create the output
(for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do echo %%a^|%%b) > output.txt
有关批处理文件中阵列管理的更多详细信息,请参阅:Arrays, linked lists and other data structures in cmd.exe (batch) script