找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: PCL0769

[文本处理] 请老师抽空帮写一个批处理文本合并去重复(已解答,谢谢各位老师的帮助!)

[复制链接]
发表于 2021-10-4 16:04:00 | 显示全部楼层
本帖最后由 newswan 于 2021-10-4 16:08 编辑

回复 15# qixiaobin0715


欠考虑,如果是单文件去重,需要清除变量

谢谢!!!
发表于 2021-10-4 16:07:22 | 显示全部楼层
本帖最后由 newswan 于 2021-10-4 18:52 编辑

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION

  3. set sour=C:\Users\admin\Desktop\New folder (2)\aaa
  4. set dest=C:\Users\admin\Desktop\New folder (2)\bbb
  5. set exclude=20210226

  6. del "%dest%\*.txt"

  7. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%sour%\*.txt"`) do (
  8.     sed -r -n -e "/\w+\s+\w+\s+\w+/p" -e "/%exclude%/d" "%%~fa">> "%dest%\%%~na.txt"
  9. )

  10. for /f "usebackq tokens=* delims=" %%a in (`dir /s /b "%dest%\*.txt"`) do (
  11.     for /f "usebackq tokens=2 delims==" %%a in (`set __ 2^>nul`) do (
  12.         set %%a=
  13.     )
  14.     for /f "usebackq tokens=* delims=" %%a in ("%%~fa") do (
  15.         set __%%a=1
  16.     )
  17.    
  18.     (
  19.         for /f "usebackq tokens=2 delims==" %%a in (`set __`) do (
  20.             echo %%a
  21.         )
  22.     ) > "%%~fa"
  23.     notepad.exe "%%~fa"
  24. )

复制代码

评分

参与人数 1技术 +1 收起 理由
PCL0769 + 1 谢谢老师出手帮助!高技术!高人品!

查看全部评分

 楼主| 发表于 2021-10-4 18:02:21 | 显示全部楼层
本帖最后由 PCL0769 于 2021-10-4 18:12 编辑

回复 15# qixiaobin0715
老师好!
现在用老师你上次帮写的D:/ABC合并,然后用vbs  SZ替换为0|   SH 替换为1|  空格替换成| SZ138...-QQ...替换成空格(此处还是留有不全的一行数据)。
分两步完成,首先用bat合并 ,然后vbs替换,这么做的结果是会留有不完整的行数据

0|301075|20210930|44406634
1|601077|20210930|-67302759
0||20210930|0 (0|后面的空格就是SZ139...-QQ...替换后的空数值)

newswan老师好!
楼上的代码还是闪退。
谢谢!
发表于 2021-10-4 18:54:24 | 显示全部楼层
我这里运行是正确的,你自己调试吧
 楼主| 发表于 2021-10-4 19:13:40 | 显示全部楼层
回复 19# newswan
老师好!刚刚传了部分文本到云盘。
链接:
https://pan.baidu.com/s/1hqJLvFBn6n1Y-g9518TVyw
提取码:
9ewg
发表于 2021-10-4 20:58:28 | 显示全部楼层
回复 20# PCL0769


数据量很大,powershell 效率高些
  1. $sour = "D:\share\tech\New folder (2)\aaa"
  2. $dest = "D:\share\tech\New folder (2)\ccc"
  3. $exclude = "20210227"

  4. Remove-Item $dest\*.txt

  5. get-date

  6. Get-ChildItem -path $sour *.txt -Recurse | foreach-object {
  7.     $_.fullname
  8.     ( get-content $_.fullname ) -match "\w+\s+\w+\s+[-]?\w+" -notmatch $exclude -replace "SZ","1" -replace "SH","0" -replace "\s+","|" | out-file -append $dest\$_
  9. }

  10. get-date

  11. Get-ChildItem -path $dest *.txt | foreach-object {
  12.     $_.fullname
  13.     $a = get-content $_.fullname | sort-object -unique
  14.     $a | out-file $dest\$_
  15. }

  16. get-date
复制代码

评分

参与人数 1技术 +1 收起 理由
PCL0769 + 1 谢谢老师出手帮助!高技术!高人品!

查看全部评分

发表于 2021-10-4 21:41:33 | 显示全部楼层
回复 18# PCL0769


建议以后不要再说“不行”、“一闪而过”、“没有反应”之类的话,因为这对于想要给你进一步帮助的人来说没有任何意义。希望大家都能学会的一个知识点是:如何查看代码的报错信息。

如果你在执行.bat脚本,请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ

如果你在执行.ps1脚本,请参考:
http://bbs.bathome.net/thread-31071-1-1.html
 楼主| 发表于 2021-10-4 22:56:43 | 显示全部楼层
回复 22# Batcher
好的谢谢老师提醒,以后注意。
双击运行时,只见到闪了一下,来不及看批处理出现什么问题就退出界面,小白一枚,还请老师见谅!
 楼主| 发表于 2021-10-4 23:07:07 | 显示全部楼层
本帖最后由 PCL0769 于 2021-10-4 23:08 编辑

回复 21# newswan
老师好!谢谢!
请教老师,后缀是用bat吗?
源数据放在桌面C:\Users\Administrator\Desktop\15单\金额16\补数据文件夹下
这里是不是要这么修改:
$sour = "C:\Users\Administrator\Desktop\15单\金额16\补数据\aaa"
$dest = "C:\Users\Administrator\Desktop\15单\金额16\补数据\ccc"
按这修改后还是闪退,是不是在最后加上PUSH就不会出现闪退,实在太快退出界面不知道没运行起来是什么原因。
发表于 2021-10-4 23:48:05 | 显示全部楼层
本帖最后由 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

复制代码
发表于 2021-10-5 11:26:48 | 显示全部楼层
回复 21# newswan
确实是这样。批处理代码倒是写出来了,真是慢的让人忍受不了。
发表于 2021-10-5 12:00:37 | 显示全部楼层
本帖最后由 newswan 于 2021-10-5 12:23 编辑

回复 26# qixiaobin0715

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

第三方命令,有的和  windows 自带命令重名
第三方命令保存到单独目录,然后把这个路径添加到 %path% 的前面部分
比如
  1. set Path=C:\msys64\usr\bin;%Path%
复制代码
发表于 2021-10-5 12:27:44 | 显示全部楼层
回复 27# newswan
批处理处理大文本文件速度确实慢,就楼主提供的文件测试,for /f 变量替换速度也不行。
发表于 2021-10-5 13:12:49 | 显示全部楼层
本帖最后由 newswan 于 2021-10-5 13:15 编辑

回复 28# qixiaobin0715


vbs 不会,但是 powershell 效率低,是很无语的。ms 一向是这样
批处理+第三方 有时候也麻烦。
 楼主| 发表于 2021-10-5 13:19:51 | 显示全部楼层
本帖最后由 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夜。速度慢点没关系,只要数据转换不出错就行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:48 , Processed in 0.040301 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表