[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 14# qixiaobin0715
  
     很精简,刚试了下第一个的代码,发现有漏,文本内容如下:
  1. 12345
  2. 12345w
  3. 12345678
  4. 1234
  5. 123
  6. 中文
  7. 中文字
  8. 中国文字
  9. 1
  10. 2
  11. 3
复制代码
运行结果如下:
  1. 1
  2. 2
复制代码
应该要的结果是(提取少于3个字符的行内容):
  1. 中文
  2. 1
  3. 2
  4. 3
复制代码

TOP

回复 8# WBATW


   
对于文本处置,俺比较喜欢用gawk ( http://bcn.bathome.net/tool/4.1.0/gawk.exe
对于第1个问题
  1. gawk "length($0)<3&&NF" *.txt>3.txt
复制代码
对于第2个问题
  1. gawk "length($0)=>3||NF==0" *.txt>4.txt
复制代码
注意:txt文件应该为ANSI编码格式,如果是UFT-8格式,需用Ruby-3.1.2-1提供的gawk处置

TOP

回复 17# hfxiang

试了下,第一个代码运行正常。第2个代码运行报错。
  1. gawk: cmd. line:1: length($0)=>3||NF==0
  2. gawk: cmd. line:1:           ^ syntax error
  3. 请按任意键继续. . .
复制代码

TOP

回复 18# fzp070


   
俺的电脑测试正常,你试试下面这个
  1. gawk "(length($0)>=3)||(NF==0)" *.txt>4.txt
复制代码
1

评分人数

    • fzp070: 代码精简有效技术 + 1

TOP

本帖最后由 qixiaobin0715 于 2022-10-24 14:50 编辑

回复 16# fzp070
还真是这么回事,findstr中的一般表达式对非ASCII字符好像不怎么友好,1个点号代表一个字节,而1个中文字符是2个字节,所以就出现了上述问题,如果是ASCII字符就没问题。至于例子中的最后一行3未显示出来,我想可能是因为文本最后一行未加回车换行。
第2个代码也会有同样的情况出现。已在原楼层作了补充说明。

TOP

回复 13# fzp070

代码测试成功运行,功能实现每个文件独立输出到文本,也可以输出到一个文件

,感觉效果很好,还写了3个方案,真诚感谢你的辛苦付出,谢谢!关于if...和

dir及findstr的关系还存疑惑,需继续向专家们学习!

TOP

回复 19# hfxiang

这个正常,感谢解答和分享!

TOP

回复 14# qixiaobin0715

首先,非常感谢你列举了两个问题的代码。辛苦了!
其次,请问一下专家:运行代码的结果出现了以下情况:
中间行为回车符空行的会提取出来;纯数字字母的可以正常提取到而纯汉字的却

提取不到(同样是2个字符如“2进”和“二进”。好像与字符的字节大小有关)

、或者有少数提取(数字开头的容易获取到哦)。主要是中文汉字,代码2的情况

好于代码1,特别是能在原文件中直接去除字符的方法很好。请教专家是什么情况

,是否可以通过修改代码能解决。再次感谢!

TOP

回复 20# qixiaobin0715


    了解了,谢谢解答!

TOP

回复 17# hfxiang

非常感谢再次提出解决和分析方案。在此真诚感谢各位

专家的指教,谢谢!

谢谢大家的热情和参与!

TOP

回复 20# qixiaobin0715
非常感谢你的热情,你也发现了问题

TOP

回复 15# Batcher


    好的,谢谢提示!

TOP

回复 21# WBATW


    客气了,相互学习!
    13楼的代码只提供了[提取少于3个字符数的行内容]。
如下代码是去除少于3个字符的行内容,并保存至文本所在目录,和文本相同名-1.txt文档内(也可以保存在同一个文档内,自己改下)。
  1. @echo off&setlocal EnableDelayedExpansion
  2. set j=1
  3. ::获取批处理目录及子目录所有txt文本
  4. for /f "delims=" %%i in ('dir /b /a-d /s *.txt') do (
  5. set "tet=%%i"
  6. rem 提取文本路径、文件名、文件后缀
  7. for %%I in ("!tet!") do (set fp=%%~dpI&set fn=%%~nI&set fx=%%~xI)
  8. echo 正在处理文本!j!:!fn!!fx!
  9. rem 对文本每行进行字符数判断,保留3个字符及以上的行内容,输出至文本同名-1.txt的文档内
  10. for /f "tokens=1 delims=" %%a in ('findstr .* "!tet!"') do (
  11.     set tempa=%%a
  12.         if not "!tempa:~2,1!"=="" echo %%a>>"!fp!!fn!-1!fx!"
  13. )
  14. set /a j+=1
  15. )
  16. echo 运行完成
  17. pause
  18. exit
复制代码

TOP

本帖最后由 WBATW 于 2022-10-25 15:39 编辑

回复 28# fzp070
谦虚了____
还是要感谢你的回复!
    首先肯定你的思路开阔,考虑细腻,代码注释说明,条理清楚近逼完美,惯习以常,毕慧聚自成,盛器也!
(我们技术人机械人一般都,说1不2,看上去简练精准没有多余的“废话”而很有知识,但却丢失了另外一样重要的东西__沟通交流的文化。就像是有骨架没有血肉,就会远离对方的亲近感而丢失沟通交流的机会,代码是知识注释是文化....哈哈哈...扯远了)书归正传:
    代码测试一次成功,还有就是输出的新文件没有保留原格式,会把原来的空行去除了,可否通过修改代码保留原来格式;你这代码提示我想起一个新功能:某些特定的多个字符和符号比如:“本目录”“@)”“25”等等之类也提取到输出文件。这样的话可以防止虽然是小于3字符但是又需要保留的不被去除。谢谢!

TOP

回复 29# WBATW
可参考这个帖子,对28楼代码进行修改:
http://bbs.bathome.net/viewthrea ... D%D1%F9%CA%E4%B3%F6

TOP

返回列表