标题: [文本处理] [已解决]BAT脚本如何实现不同TXT文件中的数据移动? [打印本页]
作者: hacker85 时间: 2012-1-17 16:10 标题: [已解决]BAT脚本如何实现不同TXT文件中的数据移动?
大家好!
请大家帮忙看一下这个问题:
附件B.zip中是四个文件:1、2、3、all
其中1、2、3三个文件中A列内容的总和等于all文件中的A列内容总和,但是可能顺序不太一样, 不过这不是问题。
对于1、2、3三个文件中所含有的字段都是一样的,但是唯独没有“md”字段,而这个“md”字段却在all中含有。
问题是:如果用BAT代码或者窗体等形式实现让1、2、3三个文件都能够从all文件中找到自己对应的"md"内容,并把内容保存到自身的工作薄中?
注:在进行条件判断的时候,所用到的条件就是四个文件中A列的内容是相等的。
谢谢大家。
作者: hacker85 时间: 2012-1-18 08:46
自己再顶一下吧。
作者: hacker85 时间: 2012-1-18 09:21
这个.......再来顶一下。
作者: hacker85 时间: 2012-1-18 14:40
:'(
作者: hacker85 时间: 2012-1-19 14:34
我去, 不是吧,一直没有人关注吗?
作者: skywarden 时间: 2012-1-19 15:01
打酱油的路过
作者: applba 时间: 2012-1-19 17:10
- @echo off
- pushd "%~dp0"
- rem下面两句指定要处理的文件,请根据需要自行修改!
- set file1=wellhead_422.txt
- set file2=wellhead_all.txt
- for /f "tokens=1*" %%a in (%file1%) do if not "%%a"=="" set %%a=1
- (for /f "tokens=1*" %%A in (%file2%) do if defined %%A echo %%A %%B) >"new_%file1%"
- echo %file1%处理完成。
- pause>nul
复制代码
请把所有相关文件移动到一个目录下!
由于论坛会转换代码中的TAB到空格,楼主可以直接下载附件。
作者: hacker85 时间: 2012-1-19 19:56
回复 7# applba
不管怎样,先谢谢你,我先测试和学习你的代码,后续报告中……
作者: hacker85 时间: 2012-1-19 21:51
本帖最后由 hacker85 于 2012-1-19 21:59 编辑
回复 7# applba
这段代码是成功的,谢谢你,不过有两个问题想请教:
1、这个默认只能处理一个文件,如果能写一个循环就好了,可以自动处理其他文件了,希望可能改进一下。
2、这里的代码的意图我不是太明白,因为我目前在积极的学习批处理,有些还没有学懂,如果可能,请做一个注释好吗?=========这条取消,我自己解决了。
3、对于第2条,如果实在没有时间的话, 也没有关系。
作者: applba 时间: 2012-1-19 22:36
回复 9# hacker85
关键代码只有两句for而已;
我都已经为你做好修改工作了,你把 set file1= 修改为其他要处理文件即可。
你要处理的文件很多吗?
作者: hacker85 时间: 2012-1-19 22:45
本帖最后由 hacker85 于 2012-1-19 22:59 编辑
回复 10# applba
恩,两个for我没有读懂。
类似422这样的文件有很多,大概有200多个吧,都是和all有着本帖中叙述的一样的关系。
all文件我只是截取了一部分放上来,正常的文件有14000多行。
这200多个文件的第一列合起来正好是14000多行。在这个活中,200多个文件的第一列的内容都是不同的,没有重复的(当然也希望在设计程序的时候能考虑到某两个或几个文件的第一列会有重复的现象,
或许可以用defined的踢除重复行的写法)。
作者: hacker85 时间: 2012-1-19 22:59
本帖最后由 hacker85 于 2012-1-19 23:06 编辑
回复 10# applba
1、tokens=1* 这个我不懂:我知道tokens=1,*是什么意思,但是没有逗号的是什么意思呢?
2、第一个for里把%%a设置成1是什么意思?又为什么紧跟着就可以用()了呢?应该是do后面才可以接括号的呀。
3、>"new_%file1%"这句是在往一个文件里写数据的意思,并把新文件起了一个带有new_字符的名字,但是新文件的第一个数据可以这样,其第二条数据就应该有>>符号了吧?并且不论是
>还是>>,它们的前面都应该有echo呀,可是我看到的echo还在第二个for的括号中,它能影响到这个新文件吗?
注:奇怪的是,你的代码的结果是对的,但是按我的批处理知识来理解却想不明白。
作者: applba 时间: 2012-1-19 23:35
- @echo off
- SETLOCAL EnablEdElayEdExpansion
- pushd "%~dp0"
- if exist wellhead_all.txt ren wellhead_all.txt wellhead_all.bak
- for %%i in ( wellhead_*.txt ) do (
- set file1=%%~i
- echo %%~i 处理中…
- echo.
- for /f "tokens=1*" %%a in (!file1!) do if not "%%a"=="" set %%a=1
- (for /f "tokens=1*" %%A in (wellhead_all.bak) do if defined %%A echo %%A %%B) > new_%%~i
- echo %%~i 处理完成
- echo.
- )
- if exist wellhead_all.bak ren wellhead_all.bak wellhead_all.txt
- pause
复制代码
请自行替换 %%A %%B之间的空格为TAB。
作者: applba 时间: 2012-1-19 23:42
本帖最后由 applba 于 2012-1-19 23:44 编辑
回复 12# hacker85
1、1*表示,第一列内容返回给第一个For变量,后面所有的内容原封不动作为一列内容返回给第二个For变量。
2、设置为1是使其成为defined状态,只要不是空的,可以是其他任何值~
3、使用括号括起整个For语句,可以把它的全部输出一次性重定向到文件~
作者: hacker85 时间: 2012-1-21 16:49
回复 14# applba
感谢你的回复,在你的回复中我不只看到了白白的代码,还看到了你的诲人不倦的精神,向你学习。
作者: hacker85 时间: 2012-2-2 08:48
回复 13# applba
appleba 你好:我用你的这段代码去整理数据后,发现一个问题:属于401的数据,经过处理后却在402中也发现了401的完整数据,422中也有401的(422同时还包含了402的)
这样就不对了。 所以有时间能再看看代码吗?谢谢
作者: applba 时间: 2012-2-2 22:23
- @echo off
- pushd "%~dp0"
- if exist wellhead_all.txt ren wellhead_all.txt wellhead_all.bak
- for %%i in ( wellhead_*.txt ) do (
- echo %%~i 处理中…
- echo.
- SetLocal
- for /f "tokens=1*" %%a in (%%~i) do if not "%%a"=="" set %%a=1
- (for /f "tokens=1*" %%A in (wellhead_all.bak) do if defined %%A echo %%A %%B) > new_%%~i
- ENDLOCAL
- echo %%~i 处理完成
- echo.
- )
- if exist wellhead_all.bak ren wellhead_all.bak wellhead_all.txt
- pause
复制代码
自行替换空格到TAB
作者: hacker85 时间: 2012-2-3 08:40
回复 17# applba
谢谢allpeba 这回是对的。
原来是延迟变量的原因。
作者: applba 时间: 2012-2-3 13:30
回复 18# hacker85
不是变量延迟扩展的原因~
这是变量作用范围和存活期的问题,在我的理解中是叫变量的局部化~
作者: hacker85 时间: 2012-2-4 13:40
回复 19# applba
学习了。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |