Board logo

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

作者: Dana    时间: 2011-10-12 17:39     标题: [已解决]批处理怎样修改文件夹下的所有文件,更新内容并且覆盖原文件?

本帖最后由 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"
复制代码

作者: hfg1977    时间: 2011-10-12 18:30

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


修改文件: 保留.\path目录下的所有文本的1~18行.
危险命令,不懂勿试.
作者: Dana    时间: 2011-10-12 18:42

测试成功, 但是我提取后的内容怎么都在一行呢, 格式不对.
作者: hfg1977    时间: 2011-10-12 19:07

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

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

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

作者: hfg1977    时间: 2011-10-12 19:52

  1. sed -i "1,25 !d" Y8L7NA11A0411068_BC.txt
复制代码
没任何问题呀, 正常换行.
作者: Dana    时间: 2011-10-12 21:15

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

使用 sed 处理后的数据, Windows环境程序不能提取内容. 不过还是感谢hfg1977 的帮忙. 谢谢!
作者: hfg1977    时间: 2011-10-12 21:25

RE: 看你提供的"Y8L7NA11A0411068_BC.txt" 是ANSI格式, 检查原始文件格式是否是UNICODE.
作者: Dana    时间: 2011-10-12 21:42

已经确认原始文件格式是ANSI格式. 我的测试环境是XP Cmd. sed版本4.0.7
作者: xudaweb    时间: 2011-10-12 23:07

本帖最后由 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,就可以实现需求了!就是文件名有空格之类的特殊情况就不管用了...
作者: Dana    时间: 2011-10-12 23:47

多谢 xudaweb  回复, 明早测试数据后回复, 谢谢!
作者: Dana    时间: 2011-10-13 10:35

回复 9# xudaweb

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

但是还有个问题, 处理后数据文件的行数多了一个空行,  比如说我只需要25行, 但是实际是26行, 最后多了一个空行.
作者: xudaweb    时间: 2011-10-17 22:25

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

回复 11# Dana

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

回复 12# xudaweb


http://bbs.bathome.net/thread-14398-1-1.html
作者: xudaweb    时间: 2011-10-17 23:27

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2