[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 21# newswan


    可以试试net静态类,这里只把读写改了就快了很多,如果把替换部分也改了应该还能再加速
  1. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  2.     $_.fullname
  3.     $b=( [IO.File]::ReadAllLines($_.fullname) ) -match "\w+\s+\w+\s+[-]?\w+" -notmatch $exclude -replace "SZ","1" -replace "SH","0" -replace "\s+","|"
  4.     $a=$dest,$_.name -join '\'
  5.     [IO.File]::WriteAllLines($a,$b)
  6. }
复制代码

TOP

速度够快。

TOP

效率 比较
sed + sort
1.bat 16:01:09.17 1
1.bat 16:02:06.45 2
1.bat 16:02:21.43 3
sed + awk
2.bat 16:03:13.41 1
2.bat 16:04:11.68 2
2.bat 16:04:26.42 3

两种办法 效率相同,但是 ps 就差很多了。

TOP

gnu 命令 sed awk
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set path=%pathgnu%;%path%
  4. echo %path%
  5. set sour=新建文件夹
  6. set dest=bbb2
  7. set exclude=QQ
  8. del /q "%dest%\*.*"
  9. echo %~nx0 %time% 1 >>time.txt
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  11.     echo "%%~fa"
  12.     type "%%~fa" | sed -r -e "/\S+\s+\S+\s+\S+/^!d" -e "/%exclude%/d" -e "s/SZ/1/" -e "s/SH/0/" -e "s/\s+/^|/g"  >> "%dest%\%%~na.tmp"
  13. )
  14. echo,
  15. echo %~nx0 %time% 2 >>time.txt
  16. echo,
  17. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.tmp"`) do (
  18.     echo "%%~fa"
  19.     type "%%~fa" | awk " { arr[$0]++ ; if ( arr[$0] == 1 ) { print $0 } } "  >>"%%~dpna.txt"
  20. )
  21. echo %~nx0 %time% 3 >>time.txt
  22. echo,
  23. del %dest%\*.tmp
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

gnu命令: sed sort
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set path=%pathgnu%;%path%
  4. echo %path%
  5. set sour=新建文件夹
  6. set dest=bbb1
  7. set exclude=QQ
  8. del /q "%dest%\*.*"
  9. echo %~nx0 %time% 1 >>time.txt
  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  11.     echo "%%~fa"
  12.     type "%%~fa" | sed -r -e "/\S+\s+\S+\s+\S+/^!d" -e "/%exclude%/d" -e "s/SZ/1/" -e "s/SH/0/" -e "s/\s+/^|/g"  >> "%dest%\%%~na.tmp"
  13. )
  14. echo,
  15. echo %~nx0 %time% 2 >>time.txt
  16. echo,
  17. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.tmp"`) do (
  18.     echo "%%~fa"
  19.     type "%%~fa" | sort.exe -u >>"%%~dpna.txt"
  20. )
  21. echo %~nx0 %time% 3 >>time.txt
  22. echo,
  23. del %dest%\*.tmp
复制代码
1

评分人数

    • PCL0769: 谢谢老师出手帮助!高技术!高人品!技术 + 1

TOP

我用纯批写了一个,且未去重,测试目录用了22分钟,一直未好意思发。

TOP

一分钟不到解决,真乃高手也!

TOP

回复 31# xczxczxcz
老师好!
PS又是什么?
恳请老师详解,谢谢!

TOP

无聊 写了个 PS 跑了下, 50秒
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

本帖最后由 PCL0769 于 2021-10-5 13:40 编辑

回复 29# newswan
老师好!
下面是从论坛组装的VBS替换
Set WshShell = CreateObject("Wscript.Shell")
WshShell.Run "cmd /c dir /s/b *.txt > list.txt",vbHide
Wscript.Sleep 1000
sFile = "list.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = objFSO.OpenTextFile(sFile,1)
Do While Not oFile.AtEndOfStream
strLine = oFile.ReadLine
If Len(strLine) > 0 Then
Set File = objFSO.OpenTextFile(strLine, 1)
aryLines = File.ReadAll
File.Close
aryLines = Replace(aryLines, "SZ", "0|")
aryLines = Replace(aryLines, "SH", "1|")

Set File = objFSO.OpenTextFile(strLine, 2)
File.Write aryLines
File.Close
End If
Loop
oFile.Close
objFSO.DeleteFile sFile
Set objFSO = Nothing

这个替换效率还行,就是得分两步,一:bat合并  二:vbs替换
vbs将不完整的行和那个手机号QQ号的删除就搞不懂怎么组装

用这个VBS替换,目前一共有36个文件夹的内容,替换的话在10分钟内就完成了

只要转换的内容不出错,多花点时间没关系,最初的原始数据是个三列cvs,1月份到现在的数据拆分转换成现在的01-09文件夹,电脑不关机总运行了3天3夜。速度慢点没关系,只要数据转换不出错就行

TOP

本帖最后由 newswan 于 2021-10-5 13:15 编辑

回复 28# qixiaobin0715


vbs 不会,但是 powershell 效率低,是很无语的。ms 一向是这样
批处理+第三方 有时候也麻烦。

TOP

回复 27# newswan
批处理处理大文本文件速度确实慢,就楼主提供的文件测试,for /f 变量替换速度也不行。

TOP

本帖最后由 newswan 于 2021-10-5 12:23 编辑

回复 26# qixiaobin0715

去重 效率比较
gnu:sort = vbs > powershell > 批处理

第三方命令,有的和  windows 自带命令重名
第三方命令保存到单独目录,然后把这个路径添加到 %path% 的前面部分
比如
  1. set Path=C:\msys64\usr\bin;%Path%
复制代码

TOP

回复 21# newswan
确实是这样。批处理代码倒是写出来了,真是慢的让人忍受不了。

TOP

本帖最后由 newswan 于 2021-10-5 00:56 编辑

回复 24# PCL0769

使用 powershell 看这里
http://www.bathome.net/thread-59270-1-1.html

如果批处理,用第三方命令 sort 排序去重,效率高。
  1. ├───aaa    <--- 数据源
  2.      ├───01
  3.      └───02
复制代码

TOP

返回列表