Batch file 从文件名和计数中提取子字符串

Batch file 从文件名和计数中提取子字符串,batch-file,Batch File,下面的示例-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文件,如下所示,第

下面的示例-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和计数的输出文本文件?

@ECHO OFF
SETLOCAL
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“outfile=%destdir%\outfile.txt”
对于/f“delims=”%%a IN(
'目录/b/a-d”%sourcedir%\*-fid*“'
)做(
设置“文件名=%%a”
呼叫:进程
)
(
对于/F“tokens=1,2 delims=$=”('set$2^>Nul')中的%%a,请执行回显(%%a^ |%%b
)>“%outfile%”
后藤:EOF
:进程
设置“filename=%filename:-fid=%”
对于(“%filename%”)中的/f“delims=-”%%q,请设置/a$%%q+=1
后藤:eof
您需要更改
sourcedir
destdir
的设置以适应您的环境

生成定义为%outfile%的文件

清除所有
$
变量后(为了安全起见),在源目录中执行一个不带目录名的目录列表,并以文件的基本形式匹配*-fid*

对于找到的每个名称,将名称分配给
filename
,并执行
:process
例程,该例程首先从
filename
中删除
-fid
之前的字符,然后使用
delims=-
选项将原来介于
-fid
和以下
-
之间的零件分配给ode>%%q

将变量
$%%q设置为1(如果未定义$?,则分配
1

最后,在处理完所有名称后,使用生成样式报告的
set
列出名为
$…
的变量

$1000=2
$2000=3
使用
$
=
作为分隔符,将令牌1(例如
2000
)放入
%%a
中,将令牌2(例如
3
)放入
%%b
。使用
回送
将其写入输出,记住用插入符号(
^
)退出管道(
)以抑制作为重定向器的解释


周围的括号用于…$…
确保将输出定向到指定的目标文件。

将数字提取到临时文件中,然后计算每个数字在该文件中的出现次数

@echo关闭
setlocal EnableDelayedExpansion
>temp.txt类型nul
设置“unique_num=”
对于/f“tokens=2 delims=-”%%a in('dir/b*.dat')do(
设置“fid=%%a”
设置“num=!fid:~3!”
>>temp.txt echo!num!
回显“!unique_num!”|查找“!num!”>num
如果!errorlevel!neq 0设置“unique_num=!unique_num!!num!”
)
对于(%unique_num%)中的%%n,请执行以下操作(
对于/f“delims=:tokens=2”%%c in('find/c“%%n”temp.txt')do(
设置“计数=%%c”
回声%%n^|!计数:=!
)
)
del/f/q temp.txt
如果需要对输出进行排序,则将结果导入
排序中

@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

有关批处理文件中数组管理的更多详细信息,请参阅:

尝试使用
集合对名称进行
循环,以从文件名中提取子字符串。如果您有更详细的问题,请回来,我们将帮助您。非常感谢您Aacini。工作非常完美!!