中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-15 21:26
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已通过] 如何批量读取文本并替换内容 查看 1,114 回复 12
楼 主 [已通过] 如何批量读取文本并替换内容 发表于 2010-02-09 16:59 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
最近弄了个板块分类,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 ]
2 发表于 2010-02-10 16:18 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
请高手帮忙写个批处理文件。
3 发表于 2010-02-10 18:09 ·  中国 北京 鹏博士宽带
初级用户
积分 49
发帖 43
注册 2007-01-20 03:28
UID 77088
性别 男
状态 离线
测试是否可用。

@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!)
)
4 发表于 2010-02-10 20:22 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
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 ]
5 发表于 2010-02-10 23:48 ·  柬埔寨
初级用户
★★
积分 99
发帖 53
注册 2006-08-18 18:44
UID 60809
状态 离线

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 ]
6 发表于 2010-02-11 07:50 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
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 以下载,但不知道因放在那里,如何使用

刚开始学批处理,还请都指点
7 发表于 2010-02-11 09:31 ·  中国 北京 中电华通通信有限公司
初级用户
积分 49
发帖 43
注册 2007-01-20 03:28
UID 77088
性别 男
状态 离线
已回复邮件,因为目录中带有空格,所以做了一些修改。

@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-02-11 12:45
8 发表于 2010-02-11 12:26 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
谢谢 tongzj 的帮助,『第 7 楼』的回复已通过。
9 发表于 2010-02-12 08:24 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
另有一问题

能否将替换后的文本文件全部转换成 .SBK 的格式,如行的话,把所有 .SBK 文件放在 B 文件夹下,.sbk 样本在你邮箱中。
10 发表于 2010-02-12 10:30 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线

@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
简单!简单!再简单!
11 发表于 2010-02-12 11:06 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
terse 请看邮箱 (采掘业.sbk)
12 发表于 2010-02-12 19:09 ·  柬埔寨
初级用户
★★
积分 99
发帖 53
注册 2006-08-18 18:44
UID 60809
状态 离线
sed下载放到c:\windows\system32\下
13 发表于 2010-02-12 21:40 ·  中国 上海 电信
新手上路
积分 11
发帖 10
注册 2008-05-27 16:20
UID 119847
性别 男
状态 离线
谢谢 asnahu
论坛跳转: