标题: 80元处理文件,请帮忙 祝大家中秋快乐! 已解决 [打印本页]
作者: zrf0123 时间: 2019-9-9 22:59 标题: 80元处理文件,请帮忙 祝大家中秋快乐! 已解决
要求:
把d:se\中所有B开头的文件统计到d:se\se\wltj*.txt,("*"表示任意字符)
处理顺序:以所处理文件的修改时间为先后为序,先处理修改时间在先的文件,每处理一个文件输出一行数据到wltj*.txt,该行数据的各列字符串间由若干空格隔开,只要每列对齐即可,
以文本wltj*.txt的第一行数据(共11列,各列间由空格隔开)为参考行,具体过程如下:
1.1.把处理文件的修改时间放到第1列,单位:年月日时分秒
1.2.所处理文件名称的前4个字符放到第2列;
1.3.根据所处理文件名称的前4个字符,在d:se\se\ipref.txt中找到此字符串,并把所在行的第一个字符串,写入到wltj*.txt的第3列ip*列,若找不到该字符串则写入"-";
1.4.由文件名称的前4个字符,在d:se\se\jhref.txt中存找到此字符串,并把所在行的第一个字符串,写入到wltj*.txt的第4列jh*列,若找不到该字符串则写入"-";
1.5.把所处理文件中含有参考行第5-第10列的字符串的数量写入到wltj*.txt的对应列(第5-第10列),没有该字符串的写入0
1.6.把wltj*.txt的第6~10列值的和写入到本行第11列;
1.7.删除处理过的文件;
暂停100s从头处理周而复始
相关文件见附件。
作者: xczxczxcz 时间: 2019-9-10 06:44
看我签名 .
作者: terse 时间: 2019-9-10 09:58
本帖最后由 terse 于 2019-9-10 10:02 编辑
看错了 呵呵
作者: WHY 时间: 2019-9-10 14:39
本帖最后由 WHY 于 2019-9-12 16:22 编辑
- @if(0)==(0) echo off
- cd /d "D:\se"
- :LOOP
- for /f %%i in ('WMIC OS get LocalDateTime ^| findstr [0-9]') do set "dt=%%i"
- dir /b /a-d /od *.txt | cscript //nologo //e:jscript "%~f0" >> ".\se\wltj%dt:~0,6%.txt"
- goto :LOOP
- pause & exit /b
- @end
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var arr = ['100M', '请求', '无法', 'unreach', '一般', 'failure'];
- var ip = [], jh = [], re = /B.../ig;
-
- var objFile = fso.OpenTextFile('.\\se\\ipref.txt', 1);
- while(!objFile.AtEndOfStream){
- var s = objFile.ReadLine();
- var m = s.match(/^ping\S*/i);
- if( !m ) continue;
- while( a = re.exec(s) ){ var k = a[0].toUpperCase(); if(!ip[k])ip[k] = m; }
- }
- objFile.Close();
-
- var objFile = fso.OpenTextFile('.\\se\\jhref.txt', 1);
- while(!objFile.AtEndOfStream){
- var s = objFile.ReadLine();
- var m = s.match(/^jh\S*/i);
- if( !m ) continue;
- while( a = re.exec(s) ){ var k = a[0].toUpperCase(); if(!jh[k])jh[k] = m; }
- }
- objFile.Close();
-
- while( !WSH.StdIn.AtEndOfStream ){
- var f = fso.GetFile( WSH.StdIn.ReadLine() );
- if( !/^B....*\.txt$/i.test(f.Name) ) continue;
- var dt = new Date( f.DateLastModified );
- var s1 = dt.toLocaleString(); //第1列
- var s2 = f.Name.substr(0,4).toUpperCase(); //第2列
- var s3 = ip[s2] ? ip[s2] : '-'; //第3列
- var s4 = jh[s2] ? jh[s2] : '-'; //第4列
- var s5 = getFileData(f.Path); //第5-11列
- WSH.Echo(s1 + '\t' + s2 + '\t' + s3 + '\t' + s4 + '\t' + s5);
- if(fso.FileExists(f.Path)) f.Delete(); //删除文件
- }
-
- function getFileData(fPath){
- var map = [], s = '', total = 0;
- for(var i in arr) map[arr[i]] = 0;
- var reg = new RegExp(arr.join('|'), 'ig');
- var objFile = fso.OpenTextFile(fPath, 1);
- var str = objFile.ReadAll();
- objFile.Close();
- while( a = reg.exec(str) ) map[a[0]]++;
- for(var i=0; i<arr.length; i++){ s += map[arr[i]] + '\t'; if(i>0)total += map[arr[i]]; }
- return s + total;
- }
-
- WScript.Sleep(20 * 1000); //延时20s
复制代码
作者: 再世情緣 时间: 2019-9-10 17:59
本帖最后由 再世情緣 于 2019-9-13 00:21 编辑
- @echo off &color 0a &setlocal enabledelayedexpansion
- mode con cols=140 lines=32
- Rem 附件里面是Sec,你发的帖子里是Se,这里你自己斟酌
- set "var=D:\se\"
- pushd %var%
- Rem 下面一行是各列间距,最后一个是等待时间
- set /a l1=25,l2=9,l3=9,l4=6,l5=7,l6=8,l7=9,l8=11,l9=10,wts=100
- for /f "delims=" %%a in ('dir /b /a -d ".\se\wltj*.txt" 2^>nul') do (set "log=%var%se\%%~nxa")
- set /p code=<"!log!"
- for /f "tokens=5-10 delims= " %%a in ("!code!") do (set "code=%%a %%b %%c %%d %%e %%f")
- for /f "tokens=1,3,5,7,9,11 delims=/ " %%a in ("!code!") do (
- set "str=%%a %%b %%c %%d %%e %%f"
- set "str1=%%a"
- set "str2=%%b"
- set "str3=%%c"
- set "str4=%%d"
- set "str5=%%e"
- set "str6=%%f"
- )
- :loop
- for /f "delims=" %%a in ('dir /b /a -d /o:d ".\B*" 2^>nul') do (
- set "txt=%%~fa"
- set "tm=%%~ta "
- set "tm=!tm:~,%l1%!"
- set "txtn=%%~na"
- set "txtn=!txtn:~,4!"
- set "ipr="
- for /f "tokens=1 delims= " %%i in ('findstr /L /I "!txtn!" ".\se\ipref.txt" 2^>nul') do (set "ipr=%%i")
- if "#!ipr!#" EQU "##" set "ipr= - "
- set "jhr="
- for /f "tokens=1 delims= " %%i in ('findstr /L /I "!txtn!" ".\se\jhref.txt" 2^>nul') do (set "jhr=%%i")
- if "#!jhr!#" EQU "##" set "jhr= - "
- set "ipr=!ipr! " &&set "ipr=!ipr:~,%l2%!"
- set "jhr=!jhr! " &&set "jhr=!jhr:~,%l3%!"
- set /a "sum=0"
- for %%i in (%str%) do (
- set "%%i=0"
- set /a "num=0"
- for /f "delims=" %%x in ('findstr /L /I "%%i" "!txt!" 2^>nul') do (set /a "num+=1")
- set /a "sum+=num"
- set "%%i=!num! "
- )
- set "%str1%=!%str1%:~,%l4%!"
- set "%str2%=!%str2%:~,%l5%!"
- set "%str3%=!%str3%:~,%l6%!"
- set "%str4%=!%str4%:~,%l7%!"
- set "%str5%=!%str5%:~,%l8%!"
- set "%str6%=!%str6%:~,%l9%!"
- echo.!tm! !txtn! !ipr! !jhr! !%str1%! !%str2%! !%str3%! !%str4%! !%str5%! !%str6%! !sum! >>"!log!"
- echo.!tm! !txtn! !ipr! !jhr! !%str1%! !%str2%! !%str3%! !%str4%! !%str5%! !%str6%! !sum!
- Rem 删除文件
- del /q /f "!txt!" >nul
- )
- ping localhost -n %wts% >nul
- goto :loop
- call exit
复制代码
作者: zrf0123 时间: 2019-9-10 22:59
回复 4# WHY
wltj*.txt 的第一行参考数据 是变化的,需要提取后使用,主程序中不应出现具体字符串
被统计的文件需立即删除
请稍作变更,谢谢!
作者: zrf0123 时间: 2019-9-10 23:01
回复 5# 再世情緣
wltj*.txt 的第一行参考数据 是变化的,需要提取后使用,主程序中不应出现具体字符串
被统计的文件需立即删除
能高效率执行,直接输出到文本即可,不必加倒计时等
有时间请修改下,谢谢!
作者: WHY 时间: 2019-9-11 00:16
回复 6# zrf0123
已修改。
如果不需要循环,删除第 57 行、第 6 行、第 3 行。
作者: 再世情緣 时间: 2019-9-11 16:15
回复 7# zrf0123
从wltj文件读取5-10列修改完了,效率。。。。
作者: terse 时间: 2019-9-11 19:39
本帖最后由 terse 于 2019-9-11 19:41 编辑
来一个 powershell 的- function Script:Fileinfo{
- param([String]$pha,[String]$phb,[String]$f1,[String]$f2)
- Begin {
- $array = '修改时间','文件名称','ip','jh','100M','请求','无法','unreach','一般','failure','wl','result'
- $arr =$array[4..9]
- $text = ''
- }
- process{
- $s1 = $_.LastWriteTime.ToString('yyyy年MM月dd日HH:mm:ss')
- $s2 = ($_.BaseName).Substring(0,4)
- $s3 = (select-string $f1 -pattern "$s2" -AllMatches -Encoding default).Line
- if (!$s3) {$s3 = "-"}
- $s4 = (select-string $f2 -pattern "$s2" -AllMatches -Encoding default).Line
- if (!$s4) {$s4 = "-"}
- $ar = New-Object System.Collections.ArrayList
- for (;$ar.Add(0) -lt 5;){}
- $s = (select-string $_ -pattern $arr -AllMatches -Encoding default | group Pattern)
- [int] $len = $s.name.Count
- if ($len -gt 0) {
- for ($i = 0;$i -lt $len; $i++) {
- if ($arr -contains $s[$i].name) {
- $ar[$arr.indexof($s[$i].name)] += $s[$i].Count
- }
- }
- }
- $sum = ($ar[1..5] | Measure-Object -Sum).Sum
- $ar = ,$s4.split(' ')[0].PadRight(5) + $ar
- $ar = ,$s3.split(' ')[0].PadRight(10) + $ar
- $ar = ,$s2.PadLeft(3) + $ar
- $ar = ,$s1.PadRight(10) + $ar
- $ar += "$sum"
- $text += ($ar -join("`t")) + "`n"
-
- }
- end {
- $f = $phb+'wltj'+ $(-join((48..57 + 65..90 + 97..122) | get-random -count 6 | %{[char]$_}))+'.txt'
- $text | Out-File -Encoding default $f
- Get-ChildItem -Path $pha B*.txt -Force| Sort-Object -Property LastWriteTime |Where-Object {!$_.PSIsContainer} |remove-item
- }
- }
- $pha="d:\se\"
- $phb="d:\se\se\"
- $f1 = "$phb"+"ipref.txt"
- $f2 = "$phb"+"jhref.txt"
- Get-ChildItem -Path $pha B*.txt -Force| Sort-Object -Property LastWriteTime |Where-Object {!$_.PSIsContainer} | Fileinfo "$pha" "$phb" "$f1" "$f2"
复制代码
作者: 523066680 时间: 2019-9-11 21:22
做做样子,- use utf8;
- use Encode;
- use Modern::Perl;
- use File::Slurp;
- use Date::Format;
- use List::Util qw/sum/;
- STDOUT->autoflush(1);
-
- my $jhref = load_hash( "./se/jhref.txt" );
- my $ipref = load_hash( "./se/ipref.txt" );
- my @items = load_item( "./se/wltj201906.txt" );
-
- for my $f ( sort { (stat($a))[9] <=> (stat($b))[9] } glob "*.txt" )
- {
- next unless $f =~ /(\w+)\s+(\d+)/;
- my $id = $1;
- my $text = read_file($f);
- my @count = map { $text =~ s/${_}//g } @items;
- printf "%-25s %-9s %-10s %-10s %d %d %d %d %d %d %d\n",
- encode('gbk', time2str( "%Y年%m月%d日%k:%M:%S", (stat($f))[9])),
- $id,
- exists $ipref->{$id} ? $ipref->{$id} : "-",
- exists $jhref->{$id} ? $jhref->{$id} : "-",
- @count,
- sum(@count);
- }
-
- sub load_item
- {
- my ($head) = read_file( $_[0] );
- my @items = split(/\s+/, $head);
- return grep { s/[\/\*].*// } @items[4..9];
- }
-
- sub load_hash
- {
- my @lines = read_file( $_[0] );
- my $hash = {};
- for my $e ( grep { /^(j|p)/i } @lines )
- {
- my ($head, @list) = split(/\s+/, $e);
- grep { s/\*//; $hash->{$_} = $head } @list;
- }
- return $hash;
- }
复制代码
补充结果:- 2019年06月10日 9:37:44 B096 ping220 jh89 0 5 0 0 0 0 5
- 2019年06月10日 9:37:47 B105 ping220 jh90 0 2 0 0 0 0 2
- 2019年06月10日 9:37:48 B093 ping220 - 0 7 0 0 0 0 7
- 2019年06月10日 9:41:17 B079 ping230 jh89 0 2 0 0 0 0 2
- 2019年06月10日 9:41:19 B078 ping221 jh89 0 3 0 0 0 0 3
- 2019年06月18日10:54:36 B105 ping220 jh90 0 3 0 0 0 0 3
- 2019年06月18日10:54:36 B111 ping230 jh90 0 3 0 0 0 0 3
- 2019年06月18日10:54:39 B090 ping1 jh90 0 3 0 0 0 0 3
- 2019年06月18日10:54:39 B110 - jh90 0 2 0 0 0 0 2
- 2019年06月19日20:19:59 B254 - jh0 0 3 0 1 5 0 9
- 2019年06月20日19:00:05 B074 ping221 jh89 1 2 0 0 0 0 3
- 2019年06月20日19:03:16 B074 ping221 jh89 1 1 0 0 0 0 2
复制代码
错了也不改,逃
作者: zrf0123 时间: 2019-9-12 22:10
回复 5# 再世情緣
提示“命令语法不正确”,无法正常运行
作者: zrf0123 时间: 2019-9-12 22:17
回复 10# terse
运行结果多处不可哦。
作者: zrf0123 时间: 2019-9-12 22:21
WHY 发表于 2019-9-10 14:39
基本可以,请回复下短消息内容,谢谢!
作者: terse 时间: 2019-9-12 23:18
回复 terse
运行结果多处不可哦。
zrf0123 发表于 2019-9-12 22:17
多处不可是什么情况
实际数据和给出的格式有出入吗
作者: 再世情緣 时间: 2019-9-13 00:22
回复 12# zrf0123
这边测试没有问题啊。。。我是WIN7 X64 系统
作者: WHY 时间: 2019-9-13 09:42
回复 14# zrf0123
好的,已回复。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |