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

[文本处理] [已解决]批处理怎样修改文件夹下的所有文件,更新内容并且覆盖原文件?

本帖最后由 Dana 于 2011-10-17 09:09 编辑

下面的代码是将一个文件按照行数提取后生成新的文件, 并且将原文件覆盖, 但是代码一次只能完成一个文件的修改, 如何能批量修改一个文件夹下的所有txt文件,  (更新内容并且覆盖原文件), 多谢!  sed 处理后的数据文件在Win 下程序不能正常读取相关内容. 请大家帮忙修改下面的代码, 使之可以批量处理数据. 谢谢!
  1. :: 保留文本中的前 N 行(覆盖原文件) .
  2. @echo off
  3. :: -------- 设置 --------
  4. set File="1.TXT"
  5. set N=18
  6. :: -------- /设置 --------
  7. if not exist %File% exit
  8. if not defined N exit
  9. findstr /n .* %File% > "%temp%\tmp"
  10. (
  11.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  12.         set Var=%%a
  13.         set /a Line = Var
  14.         SetLocal EnableDelayedExpansion
  15.         if !Line! leq !N! echo,!Var:*:=!
  16.         EndLocal
  17.     )
  18. ) > %File%
  19. del "%temp%\tmp"
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
一书,一隅,一香茗;半梦,半醒,半人生……

本帖最后由 hfg1977 于 2011-10-12 18:33 编辑
  1. sed -i "1,18 !d" .\path\*.txt
  2. del sed??????
复制代码


修改文件: 保留.\path目录下的所有文本的1~18行.
危险命令,不懂勿试.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

测试成功, 但是我提取后的内容怎么都在一行呢, 格式不对.
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

RE:"提取后的内容怎么都在一行呢"

很常见的问题, 你的原始文件没使用ms标准的换行符号, 你会看到每行后面跟个黑色方块. 并不影响使用.

这个命令 "转换Unix新行符(LF)为DOS格式"
  1. sed -i "s/$//" .\path\*.txt
  2. del sed??????
复制代码
1

评分人数

    • Dana: 学到很多技术 + 1
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

  1. sed -i "1,25 !d" Y8L7NA11A0411068_BC.txt
复制代码
没任何问题呀, 正常换行.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

本帖最后由 Dana 于 2011-10-12 21:17 编辑

使用 sed 处理后的数据, Windows环境程序不能提取内容. 不过还是感谢hfg1977 的帮忙. 谢谢!
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

RE: 看你提供的"Y8L7NA11A0411068_BC.txt" 是ANSI格式, 检查原始文件格式是否是UNICODE.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

已经确认原始文件格式是ANSI格式. 我的测试环境是XP Cmd. sed版本4.0.7
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

本帖最后由 xudaweb 于 2011-10-12 23:31 编辑

回复 1# Dana
写成两个batch分两步走:
1,先把下面这个batch改成处理%1的动态环境变量,如命名为get_lines.cmd
  1. @echo off
  2. set N=5
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! leq !N! echo,!Var:*:=!
  12.         EndLocal
  13.     )
  14. ) > %1
  15. del "%temp%\tmp"
复制代码
2,再执行下面这个batch循环执行结束就可以了,如命名doall.cmd
  1. @echo off
  2. for %%i in (*.txt) do (
  3. get_lines.cmd %%i
  4. )
复制代码
只需执行doall.cmd一个batch,就可以实现需求了!就是文件名有空格之类的特殊情况就不管用了...
1

评分人数

    • Dana: 乐于助人技术 + 1
学习...

TOP

多谢 xudaweb  回复, 明早测试数据后回复, 谢谢!
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

回复 9# xudaweb

参数传递就可以了, 谢谢!

但是还有个问题, 处理后数据文件的行数多了一个空行,  比如说我只需要25行, 但是实际是26行, 最后多了一个空行.
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

本帖最后由 xudaweb 于 2011-10-17 22:27 编辑

回复 11# Dana

测试了下,是有你说的这个问题,暂时还没找到删除最后一行空行的办法...
哪位高手知道怎么处理,贴上代码让我们学习学习啊...
学习...

TOP

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher
多谢版主的热心肠,刚看到原楼主另开一贴专门讨论。
学习...

TOP

返回列表