标题: [文本处理] 【已解决】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
将复制代码
以ANSI编码格式保存为001.txt
将复制代码
以ANSI编码格式保存为002.txt
将复制代码
以ANSI编码格式保存为003.txt
下载64位版本的gawk64( http://bcn.bathome.net/tool/gawk64.exe )(注意32位的不支持"0*.txt"文件输入方式)
执行:- 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")- D:\data\001.txt
- D:\data\002.txt
- D:\data\003.txt
-
- Total Files: 3
-
- 1
- 2
- 3
复制代码
注意:当不存在"D:\data\0*.txt"文件时,将报错
作者: WHY 时间: 2022-11-22 13:12
本帖最后由 WHY 于 2022-11-22 13:13 编辑
- <# :
- @echo off
- PowerShell -Noprofile -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\"))"
- pause & exit /b
- #>
-
- $path = 'D:\Data\'; #源文件存放路径
- $dic = New-Object 'System.Collections.Generic.Dictionary[string, int]'; #字典,key=数据,value=个数
- $res = [Collections.ArrayList]@(); #数组,存放结果
-
- forEach( $file In (dir -Literal $path -Filter *.txt) ){
- $hash = @{};
- $arr = [IO.File]::ReadAllLines($file.FullName) -split '\s+' -notMatch '^$';
- $count = $arr.Count;
- for( $i = 0; $i -lt $count; $i++ ){
- if( -Not $hash.ContainsKey($arr[$i]) ){
- $hash.Add( $arr[$i], $true ); #单个文件数据去重
- $dic[$arr[$i]]++; #统计数据个数
- }
- }
- $num++; #文件个数
- }
-
- forEach( $key In $dic.Keys ){
- if( $dic[$key] -eq $num ){
- [void]$res.Add($key);
- }
- }
-
- [IO.File]::WriteAllLines( $path + 'result.Log', $res );
复制代码
作者: terse 时间: 2022-11-22 15:37
本帖最后由 terse 于 2022-11-22 16:20 编辑
处理D盘DATA文件夹的文件 要修改一下代码 加个过滤- @if(0)==(0) echo off
- cd /d "D:\data\"
- dir /b /a-d "*.txt" | findstr /ixv "统计.txt" | cscript.exe //NoLogo //E:JScript %0
- pause&goto:eof
- rem 保存为ANSI文件
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var obj = {},f = "统计.txt";
- while( !WSH.StdIn.AtEndOfStream ){
- var file = WSH.StdIn.ReadLine();
- var fi = fso.OpenTextFile(file, 1);
- var text = fi.ReadAll().replace(/[\r\n\s]/gm,'').split('');
- fi.Close();
- for(var i=0,len = text.length; i < len; i++) {
- var tmp = text[i];
- obj[tmp] = (obj[tmp] > 0 ) ? obj[tmp] + 1 : 1;
- }
- }
- var result = '';
- for (var k in obj) { if (obj[k]>2) { result += ( result=='' ) ? k : " " + k } }
- fso.CreateTextFile(f, true).Write( result );
- WSH.Echo('重复数据:',result)
复制代码
- @echo off
- rem 保存为ANSI文件
- cd /d "d:\data\"
- 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"
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |