Board logo

标题: [文本处理] 【已解决】批处理如何实现对比2个txt后找出匹配的字符然后在后面插入指定内容? [打印本页]

作者: xuexilai    时间: 2014-8-10 19:45     标题: 【已解决】批处理如何实现对比2个txt后找出匹配的字符然后在后面插入指定内容?

本帖最后由 xuexilai 于 2014-8-10 21:27 编辑

麻烦各位哥哥姐姐帮帮忙


根据1.txt里 一七一|65465487  "|"符号前的 字符 如 "一七一"  找出2.txt里匹配相同的 如 "一七一环境"

然后在匹配的字符 "一七一环境" 后面 插入1.txt字符行" |65465487  " 的内容 然后生成3.txt


例子:

1.txt内容如下

稻草|54634667
胜人|65467
一七一|65465487
宇青|56787
datb|57675467
予希|6546876
驼驼|456879789
冲极限|547879
山水风|756867
aimu|435647
hum|546768
锦绣|4356757
路者|765987987
ax|45643545
night|4789798
toread奇笠|67867
汉|678768
凯|456354567
pelliot|7658768
Face|54656
卡侬|5645676
dzr地|68769
马哥|78978
森诺|65477
olar|768989

2.txt内容如下

一七一环境
一七一工人
一七一繁荣
一七一和
datb大概
datb色
驼驼回头人
驼驼富饶
驼驼嫂夫人
aimu工人
aimu似的
在aimu
aimu
hum会议
hum身体
十分hum
路者但是
路者大夫
ax反对
ax士
ax风格
night热
night大会
night后天
night经验

生成 3.txt内容如下

一七一环境|65465487
一七一工人|65465487
一七一繁荣|65465487
一七一和|65465487
datb大概|57675467
datb色|57675467
驼驼回头人|456879789
驼驼富饶|456879789
驼驼嫂夫人|456879789
aimu工人|435647
aimu似的|435647
在aimu|435647
aimu|435647
hum会议|546768
hum身体|546768
十分hum|546768
路者但是|765987987
路者大夫|765987987
ax反对|45643545
ax士|45643545
ax风格|45643545
night热|4789798
night大会|4789798
night后天|4789798
night经验|4789798
作者: CrLf    时间: 2014-8-10 20:34

  1. @if (0==0) @end/*
  2. @echo off
  3. cscript /e:jscript %0 1.txt 2.txt>3.txt
  4. exit /b */
  5. var fso = new ActiveXObject('Scripting.Filesystemobject')
  6. var ts1 = fso.OpenTextFile(WScript.Arguments(0),1)
  7. var ts2 = fso.OpenTextFile(WScript.Arguments(1),1)
  8. var list=[]
  9. while(!ts1.AtEndOfStream){
  10. ar = ts1.ReadLine().split(/\|/)
  11. list.push({name:ar[0],value:'|'+ar[1]})
  12. }
  13. ts1.Close()
  14. var text = ts2.ReadAll().split(/\r?\n/g)
  15. ts2.Close()
  16. for(var i in text){
  17. var str=text[i]
  18. for(var j in list){
  19. if(str.indexOf(list[j].name)!=-1){
  20. str+=list[j].value
  21. break
  22. }
  23. }
  24. WScript.Echo(str)
  25. }
复制代码

作者: CrLf    时间: 2014-8-10 20:40

来个纯批:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (2.txt) do (
  3. set "str=%%a"
  4. set "FLAG="
  5. for /f "tokens=1,2 delims=|" %%b in (1.txt) do (
  6. if not defined FLAG if "!str:%%b=!" neq "!str!" (
  7. set "str=!str!|%%c"
  8. set FLAG=1
  9. )
  10. )
  11. echo !str!
  12. ))>3.txt
复制代码

作者: xuexilai    时间: 2014-8-10 21:27

回复 3# CrLf


    麻烦了哥哥 谢谢你
作者: CrLf    时间: 2014-8-10 23:31

再来个perl
  1. open(IN,'1.txt');
  2. @text=<IN>;
  3. close(IN);
  4. foreach (@text){
  5. chop();
  6. @ar=split(/\|/,$_);
  7. $list{@ar[0]}='|'.@ar[1];
  8. }
  9. open(IN,'2.txt');
  10. while(chop($line=<IN>)){
  11. foreach (keys %list){
  12. if (index($line,$_)>=0) {
  13. $line .= $list{$_};
  14. break;
  15. }
  16. }
  17. print $line ."\r\n";
  18. }
  19. close(IN);
复制代码

作者: 523066680    时间: 2014-8-11 00:17

  1. my %hash;
  2. my @arr;
  3. my $j;
  4. foreach ( &loadf("1.txt") ) {
  5. $hash{$1}=$2 if /(.*)\|(.*)\n/;
  6. }
  7. open WRT,">:raw:crlf","3.txt" or warn "$!";
  8. foreach ( &loadf("2.txt") ) {
  9. foreach $j (keys %hash) {
  10. if (/^$j/) {
  11. s/\n?$/\|$hash{$j}\n/;
  12. print WRT $_;
  13. }
  14. }
  15. }
  16. close WRT;
  17. sub loadf {
  18. open READ,"<:raw:crlf", shift or warn "$!";
  19. @all=<READ>;
  20. close READ;
  21. return @all;
  22. }
复制代码

作者: CrLf    时间: 2014-8-11 00:58

回复 6# 523066680


    正则里也可以用 $j 啊...
    断断续续看 perl语言入门 学习中,有的用法貌似没见过
作者: 523066680    时间: 2014-8-11 08:47

本帖最后由 523066680 于 2014-8-11 08:55 编辑

回复 7# CrLf


    可以代入,不过有些情况比如 $j里面带有"\" ,后面的单个字符会被转义,尤其路径匹配可能出错。
有个\Q \E 可以作为绝对引用,这个用法是我看Perl教程的时候看漏了,在CU别人告诉我的,这里提一下。

参考: http://bbs.chinaunix.net/thread-4131501-1-1.html



─────┐
jason680  │
─────┘
─────────────┐
回复 1# 523066680         │
                          │
quotemeta or \Q           │
(perldoc -f quotemeta)    │
                          │
$str2 = quotemeta($str2)  │
or                        │
s/\Q$str2//               │
s/\Q$str2\E//             │
─────────────┘





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