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

[文本处理] 【已解决】求助批处理文件夹内所有文本合并后,提取重复数为N的字符

[复制链接]
发表于 2023-4-15 15:15:21 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-4-16 18:23 编辑

d:\data1\内有若干文本,欲将文件夹内所有文本合并后,提取重复数为7的字符,写入d:\data2\B.txt;若没有重复数为7的字符,则B.txt为空。
每个文本记录字符的格式如下:
00000 00001
00003
00004 00005 00006
...
发表于 2023-4-15 16:21:54 | 显示全部楼层
  1. @echo off
  2. cd /d "d:\data1"
  3. (type *.txt >>xxx.temp) 1>nul
  4. for /f "delims=" %%a in (xxx.temp) do (
  5.         for %%b in (%%a) do (
  6.                 set/a #%%b+=1
  7.         )
  8. )
  9. cd.>d:\data2\B.txt
  10. setlocal enabledelayedexpansion
  11. (for /f "delims=" %%a in (xxx.temp) do (
  12.         for %%b in (%%a) do (
  13.                 if !#%%b! equ 7 (
  14.                         echo %%b
  15.                         set /a #%%b+=1
  16.                 )
  17.         )
  18. ))>d:\data2\B.txt
  19. endlocal
  20. del xxx.temp
  21. pause
复制代码

不合并也可以,就是文本过多,可能会影响效率。昨天”优化“那个帖子代码,中间的延迟变量就是为了单独计数每个文本,去掉之后就是所有文本一起计数。
code  不合并
  1. @echo off
  2. cd /d "d:\data1"
  3. for /r %%i in (*.txt) do (
  4.         for /f "delims=" %%a in ('type "%%i"') do (
  5.                 for %%b in (%%a) do (
  6.                         set/a #%%b+=1
  7.                 )
  8.         )
  9. )
  10. cd.>d:\data2\B.txt
  11. setlocal enabledelayedexpansion
  12. (for /r %%i in (*.txt) do (
  13.         for /f "delims=" %%a in ('type "%%i"') do (
  14.                 for %%b in (%%a) do (
  15.                         if !#%%b! equ 7 (
  16.                                 echo %%b
  17.                                 set /a #%%b+=1
  18.                         )
  19.                 )
  20.         )
  21. ))>d:\data2\B.txt
  22. endlocal
  23. pause
复制代码



评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-4-15 16:34:37 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-15 16:39 编辑

回复 2# 77七
感谢!合并文件夹内所有文本,是中间过程,觉得没必要输出,可以将所有文本数据读入内存,在内存中提取重复数为N的字符,然后输出。
发表于 2023-4-15 16:54:09 | 显示全部楼层
回复 3# 思想之翼


   直接 in ('type *.txt') ,好方法!学习了!
发表于 2023-4-15 16:58:16 | 显示全部楼层
回复 2# 77七


    10行以后也可以这样
  1. (for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
  2. if %%b equ 7 (echo,%%a)
  3. ))>d:\data2\B.txt
  4. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-4-15 17:03:23 | 显示全部楼层
本帖最后由 77七 于 2023-4-15 17:10 编辑

回复 5# buyiyang


   学习了!很久以前见到过 set # 这种用法,一直不是很理解。在这个实例中,会不会 存在 计数为8的,也被统计出来呢
试了一下,好像不会
发表于 2023-4-15 17:13:16 | 显示全部楼层
回复 6# 77七


    为什么说计数为8的可能会被统计出来呢?set #是列出所有#开头的变量及值,if %%b equ 7选择了值为7的变量
发表于 2023-4-15 17:26:33 | 显示全部楼层
回复 7# buyiyang

我太业余了。我以为的 set #的结果是这样的...
  1. ...
  2. #00001=6
  3. #00001=7
  4. #00001=8
复制代码
发表于 2023-4-15 17:43:19 | 显示全部楼层
本帖最后由 77七 于 2023-4-15 17:44 编辑
  1. @echo off
  2. cd /d "d:\data1"
  3. for /f "delims=" %%a in ('type *.txt') do (
  4.         for %%b in (%%a) do (
  5.                 set/a #%%b+=1
  6.         )
  7. )
  8. cd.>d:\data2\B.txt
  9. (for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
  10.         if %%b equ 7 (
  11.                 echo %%a
  12.         )
  13. ))>d:\data2\B.txt
  14. pause
复制代码

综合3楼 5楼的方法,再贴一下代码,方便他人阅读。
代码精简、优化、改动好多,向两位老师学习!

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-4-15 18:23:55 | 显示全部楼层
回复 9# 77七

环境变量 # 没有定义
发表于 2023-4-15 18:43:18 | 显示全部楼层
回复 10# 思想之翼


   你是改动代码了吧?如果开延迟变量,就在代码结束再关

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-4-16 09:58:12 | 显示全部楼层
本帖最后由 hfxiang 于 2023-4-16 13:16 编辑

回复 1# 思想之翼

  1. gawk "{for(i=1;i<=NF;i++)a[$i]++}END{for(i in a)if(a[i]==7)print i}" "d:\data1\*.txt">"d:\data2\B.txt"
复制代码
之前输出错写为"d:\data1\B.txt",现改正为"d:\data2\B.txt" ,因为输入输出为同1文件夹会有冲突

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-4-16 15:14:24 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-16 15:34 编辑

回复 12# hfxiang

gawk: fatal: cannot open file `d:\data1\*.txt' for reading (Invalid argument)
感谢帮助!经测试,路径改正前后,都出现上述提示。
发表于 2023-4-16 15:37:43 | 显示全部楼层
回复 13# 思想之翼


    含通配符的路径去掉引号
  1. d:\data1\*.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-4-16 15:50:08 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-16 15:57 编辑

回复 14# buyiyang

感谢!经测试,上述所有代码,对于小文本,结果正确。但是对于大文本(3行 60000列),输出文本为空。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 22:45 , Processed in 0.026111 second(s), 11 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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