标题: [文本处理] [已解决]批处理怎样修改文件夹下的所有文件,更新内容并且覆盖原文件? [打印本页]
作者: Dana 时间: 2011-10-12 17:39 标题: [已解决]批处理怎样修改文件夹下的所有文件,更新内容并且覆盖原文件?
本帖最后由 Dana 于 2011-10-17 09:09 编辑
下面的代码是将一个文件按照行数提取后生成新的文件, 并且将原文件覆盖, 但是代码一次只能完成一个文件的修改, 如何能批量修改一个文件夹下的所有txt文件, (更新内容并且覆盖原文件), 多谢! sed 处理后的数据文件在Win 下程序不能正常读取相关内容. 请大家帮忙修改下面的代码, 使之可以批量处理数据. 谢谢!- :: 保留文本中的前 N 行(覆盖原文件) .
- @echo off
- :: -------- 设置 --------
- set File="1.TXT"
- set N=18
- :: -------- /设置 --------
-
- if not exist %File% exit
- if not defined N exit
-
- findstr /n .* %File% > "%temp%\tmp"
-
- (
- for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
- set Var=%%a
- set /a Line = Var
- SetLocal EnableDelayedExpansion
- if !Line! leq !N! echo,!Var:*:=!
- EndLocal
- )
- ) > %File%
-
- del "%temp%\tmp"
复制代码
作者: hfg1977 时间: 2011-10-12 18:30
本帖最后由 hfg1977 于 2011-10-12 18:33 编辑
- sed -i "1,18 !d" .\path\*.txt
- del sed??????
复制代码
修改文件: 保留.\path目录下的所有文本的1~18行.
危险命令,不懂勿试.
作者: Dana 时间: 2011-10-12 18:42
测试成功, 但是我提取后的内容怎么都在一行呢, 格式不对.
作者: hfg1977 时间: 2011-10-12 19:07
RE:"提取后的内容怎么都在一行呢"
很常见的问题, 你的原始文件没使用ms标准的换行符号, 你会看到每行后面跟个黑色方块. 并不影响使用.
这个命令 "转换Unix新行符(LF)为DOS格式"- sed -i "s/$//" .\path\*.txt
- del sed??????
复制代码
作者: hfg1977 时间: 2011-10-12 19:52
- 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- @echo off
- set N=5
- if not exist %1 exit
- if not defined N exit
-
- findstr /n .* %1> "%temp%\tmp"
- (
- for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
- set Var=%%a
- set /a Line = Var
- SetLocal EnableDelayedExpansion
- if !Line! leq !N! echo,!Var:*:=!
- EndLocal
- )
- ) > %1
- del "%temp%\tmp"
复制代码
2,再执行下面这个batch循环执行结束就可以了,如命名doall.cmd- @echo off
-
- for %%i in (*.txt) do (
- get_lines.cmd %%i
- )
复制代码
只需执行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 |