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

时间:2016-01-28 08:52:23

标签: 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文件,如下所示,第一个字段是fid编号,第二个字段是计数。

1000|2
2000|3

如何使用Windows批处理文件生成带有fid和count的输出文本文件?

3 个答案:

答案 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

您需要更改sourcedirdestdir的设置以适合您的具体情况。

生成定义为%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