Board logo

标题: [文本处理] 【已解决】BAT:统计文件夹内文本个数,并提取相关数据 [打印本页]

作者: 思想之翼    时间: 2022-11-22 02:17     标题: 【已解决】BAT:统计文件夹内文本个数,并提取相关数据

本帖最后由 思想之翼 于 2022-11-22 17:18 编辑

D:\data\内有若干文本
文本001 记录数据
1 2 3 4 5
6
7
文本002 记录数据
1 2 3 4
8
文本003 记录数据
1 2 3
9
0

欲统计D:\data\内的文本数量(本例3个文本)
然后合并D:\data\内的文本,取出现3次(有3个文本)的数据,写入D:\data\统计.txt(本例出现3次的数据:1 2 3 ;若没有出现3次的数据,则统计.txt文本为空)

若D:\data\内的文本数量为0,则写入D:\data\的 统计.txt文本为空
作者: hfxiang    时间: 2022-11-22 10:16

  1. 1 2 3 4 5
  2. 6
  3. 7
复制代码
以ANSI编码格式保存为001.txt
  1. 1 2 3 4
  2. 8
复制代码
以ANSI编码格式保存为002.txt
  1. 1 2 3
  2. 9
  3. 0
复制代码
以ANSI编码格式保存为003.txt

下载64位版本的gawk64( http://bcn.bathome.net/tool/gawk64.exe )(注意32位的不支持"0*.txt"文件输入方式)
执行:
  1. gawk64 "FNR==1{No++;print FILENAME}NR==FNR{if(NF){for(i=0;i++<NF;)if($i)a[$i]=No}next}NF{for(i=0;i++<NF;)if($i)if($i in a)if(a[$i]==No-1)a[$i]=No}END{printf \"\nTotal Files:\t%d\n\n\",No;for(id in a)if(a[id]==No)print id}" "D:\data\0*.txt" >"D:\data\统计.txt"
复制代码
结果("D:\data\统计.txt")
  1. D:\data\001.txt
  2. D:\data\002.txt
  3. D:\data\003.txt
  4. Total Files:    3
  5. 1
  6. 2
  7. 3
复制代码
注意:当不存在"D:\data\0*.txt"文件时,将报错
作者: WHY    时间: 2022-11-22 13:12

本帖最后由 WHY 于 2022-11-22 13:13 编辑
  1. <# :
  2. @echo off
  3. PowerShell -Noprofile -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\"))"
  4. pause & exit /b
  5. #>
  6. $path = 'D:\Data\';    #源文件存放路径
  7. $dic  = New-Object 'System.Collections.Generic.Dictionary[string, int]'; #字典,key=数据,value=个数
  8. $res  = [Collections.ArrayList]@();                                      #数组,存放结果
  9. forEach( $file In (dir -Literal $path -Filter *.txt) ){
  10.     $hash  = @{};
  11.     $arr   = [IO.File]::ReadAllLines($file.FullName) -split '\s+' -notMatch '^$';
  12.     $count = $arr.Count;
  13.     for( $i = 0; $i -lt $count; $i++ ){
  14.         if( -Not $hash.ContainsKey($arr[$i]) ){
  15.             $hash.Add( $arr[$i], $true );          #单个文件数据去重
  16.             $dic[$arr[$i]]++;                      #统计数据个数
  17.         }
  18.     }
  19.     $num++;   #文件个数
  20. }
  21. forEach( $key In $dic.Keys ){
  22.     if( $dic[$key] -eq $num ){
  23.         [void]$res.Add($key);
  24.     }
  25. }
  26. [IO.File]::WriteAllLines( $path + 'result.Log', $res );
复制代码

作者: terse    时间: 2022-11-22 15:37

本帖最后由 terse 于 2022-11-22 16:20 编辑

处理D盘DATA文件夹的文件 要修改一下代码 加个过滤
  1. @if(0)==(0) echo off
  2. cd /d "D:\data\"
  3. dir /b /a-d  "*.txt" | findstr /ixv "统计.txt" | cscript.exe //NoLogo //E:JScript %0
  4. pause&goto:eof
  5. rem 保存为ANSI文件
  6. @end
  7. var fso = new ActiveXObject("Scripting.FileSystemObject");
  8. var obj = {},f = "统计.txt";
  9. while( !WSH.StdIn.AtEndOfStream ){
  10.           var file = WSH.StdIn.ReadLine();
  11.           var fi = fso.OpenTextFile(file, 1);
  12.           var text = fi.ReadAll().replace(/[\r\n\s]/gm,'').split('');
  13.           fi.Close();
  14.           for(var i=0,len = text.length; i < len; i++) {
  15.                 var tmp = text[i];
  16.                 obj[tmp] = (obj[tmp] > 0 ) ? obj[tmp] + 1 : 1;
  17.           }
  18. }
  19. var result = '';
  20. for (var k in obj) {  if (obj[k]>2) { result += ( result=='' ) ? k :  " " + k } }
  21. fso.CreateTextFile(f, true).Write( result );
  22. WSH.Echo('重复数据:',result)
复制代码
  1. @echo off
  2. rem 保存为ANSI文件
  3. cd /d "d:\data\"
  4. dir /b /a-d  "*.txt" | findstr /ixv "统计.txt" | gawk "{for(i=1;i<=NF;i++)a[$i]++}END{for(x in a) if (a[x] >2) printf x FS}" *.txt    >"统计.txt"
  5. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2