中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已通过] 如何批量读取文本并替换内容
作者:
标题: [已通过] 如何批量读取文本并替换内容 上一主题 | 下一主题
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『楼 主』:  [已通过] 如何批量读取文本并替换内容

最近弄了个板块分类,A文件夹下有几十个下级文件夹,每个下级文件夹中都有很多文本(个数不定,文件名不同),

下级文件夹与文本都是中文名;某一下级文件夹中文本内容如下:

机电设备.TXT

000536        闽闽东
000617        石油济柴
000676        思达高科
000682        东方电子
000806        银河科技
002028        思源电气
002074        东源电器
002090        金智科技
002123        荣信股份
002169        智光电气
600192        长城电工
600268        国电南自
600343        航天动力
600382        广东明珠
600388        龙净环保

手动替换太麻烦,想用批处理解决,特来求助。

替换后内容如下:

机电设备.TXT

SZ000536
SZ000617
SZ000676
SZ000682
SZ000806
SZ002028
SZ002074
SZ002090
SZ002123
SZ002169
SH600192
SH600268
SH600343
SH600382
SH600388

把替换后的文本放入B文件夹下的对应文件夹中,

B文件夹下的下级文件夹同A文件夹(一一对应),用来存放替换后的文本。

谁会写批处理文件。

[ Last edited by top on 2010-2-11 at 12:27 ]

2010-2-9 16:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 2 楼』:  

请高手帮忙写个批处理文件。

2010-2-10 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tongzj
初级用户





积分 49
发帖 43
注册 2007-1-20
状态 离线
『第 3 楼』:  

测试是否可用。

@echo off
setlocal enabledelayedexpansion
:: 设定A、B目录路径,后面不要有\
set pathA=c:\a
set pathB=c:\b
:: 计算A目录长度用于截取后面的路径
for /l %%a in (1,1,200) do (if "!pathA:~%%a,1!"=="" (set A=%%a&goto start))

:start
:: 遍历A目录下子目录,如果B目录无此子目录则创建,替换所有txt文档
for /f "tokens=*" %%a in ('dir /b /s %pathA%\*.txt') do (
  set dest=%%a
  set dest=%pathB%!dest:~%A%!
  for /f "tokens=*" %%b in ("!dest!") do (if not exist %%~dpb md %%~dpb)
  for /f "tokens=1" %%c in (%%a) do (echo SZ%%c 1>>%!dest!)
  )

2010-2-10 18:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by tongzj at 2010-2-10 06:09 PM:
测试是否可用。

@echo off
setlocal enabledelayedexpansion
:: 设定A、B目录路径,后面不要有\
set pathA=c:\a
set pathB=c:\b
:: 计算A目录长度用于截取后面的路径 ...

谢谢 tongzj

基本可行,但替换后的文本,其代码 6 当头的前面应该加 SH ,而不是 SZ 。

我是新手,不知道如何将附件传上来。

tongzj  A.文件夹  已放入你邮箱中  请查收

[ Last edited by top on 2010-2-10 at 20:45 ]

2010-2-10 20:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
asnahu
初级用户





积分 99
发帖 53
注册 2006-8-18
状态 离线
『第 5 楼』:  


sed -i "s/\s.*//g; s/^0/SZ&/g; s/^6/SH&/g" *.txt
[ Last edited by asnahu on 2010-2-10 at 23:51 ]

2010-2-10 23:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by asnahu at 2010-2-10 11:48 PM:
sed -i "s/\s.*//g; s/^0/SZ&/g; s/^6/SH&/g" *.txt
[ Last edited by asnahu on 2010-2-10 at 23:51 ]

谢谢你的帮助

但,运行后没有反映,可能是没有 SED 的原因

SED 以下载,但不知道因放在那里,如何使用

刚开始学批处理,还请都指点

2010-2-11 07:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tongzj
初级用户





积分 49
发帖 43
注册 2007-1-20
状态 离线
『第 7 楼』:  

已回复邮件,因为目录中带有空格,所以做了一些修改。

@echo off
setlocal enabledelayedexpansion
:: 设定A、B目录路径,后面不要有\
set pathA=c:\a
set pathB=c:\b

:: 计算A目录长度用于截取后面的路径
for /l %%a in (1,1,200) do (
  if "!pathA:~%%a,1!"=="" (
    set A=%%a
    goto start
    )
  )

:start
:: 遍历A目录下子目录,如果B目录无此子目录则创建,替换所有txt文档
for /f "tokens=* delims=&" %%a in ('dir /b /s %pathA%\*.txt') do (
  echo %%a
  set dest=%%a
  set dest=%pathB%!dest:~%A%!
  if exist "!dest!" del /q /f "!dest!"
  for /f "tokens=* delims=&" %%b in ("!dest!") do (if not exist "%%~dpb" md "%%~dpb")
  for /f "tokens=1" %%c in ('type "%%a"') do (
    set code=%%c
    if "!code:~0,1!"=="6" (
      echo SH%%c 1>>!dest!
      ) else (
      echo SZ%%c 1>>!dest!
      )
    )
  )

   此帖被 +1 点积分    点击查看详情   
评分人:【 top 分数: +1  时间:2010-2-11 12:45


2010-2-11 09:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 8 楼』:  

谢谢 tongzj 的帮助,『第 7 楼』的回复已通过。

2010-2-11 12:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 9 楼』:  

另有一问题

能否将替换后的文本文件全部转换成 .SBK 的格式,如行的话,把所有 .SBK 文件放在 B 文件夹下,.sbk 样本在你邮箱中。

2010-2-12 08:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 10 楼』:  


@echo off&setlocal enabledelayedexpansion
set "a=c:\a\"
set "b=c:\b\"
for /f "delims=" %%a in ('dir /b /s /a-d "%a%*.txt"') do (
   set "str=%%~dpna"
   for %%b in ("!str:%a%=%b%!") do >nul 2>nul md "%%~dpb"
  (for /f "usebackq" %%i in ("%%a") do (
      if "%%i" lss "6" (echo sz%%i)else echo sh%%i
      ))>"!str:%a%=%b%!.SBK"
  )
pause




简单!简单!再简单!
2010-2-12 10:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 11 楼』:  

terse  请看邮箱  (采掘业.sbk)

2010-2-12 11:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
asnahu
初级用户





积分 99
发帖 53
注册 2006-8-18
状态 离线
『第 12 楼』:  

sed下载放到c:\windows\system32\下

2010-2-12 19:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
top
新手上路





积分 11
发帖 10
注册 2008-5-27
状态 离线
『第 13 楼』:  

谢谢 asnahu

2010-2-12 21:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: