标题: [文本处理] 【已解决】批处理如何实现对比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
- @if (0==0) @end/*
- @echo off
- cscript /e:jscript %0 1.txt 2.txt>3.txt
- exit /b */
-
- var fso = new ActiveXObject('Scripting.Filesystemobject')
-
- var ts1 = fso.OpenTextFile(WScript.Arguments(0),1)
- var ts2 = fso.OpenTextFile(WScript.Arguments(1),1)
-
- var list=[]
- while(!ts1.AtEndOfStream){
- ar = ts1.ReadLine().split(/\|/)
- list.push({name:ar[0],value:'|'+ar[1]})
- }
- ts1.Close()
-
- var text = ts2.ReadAll().split(/\r?\n/g)
- ts2.Close()
-
- for(var i in text){
- var str=text[i]
- for(var j in list){
- if(str.indexOf(list[j].name)!=-1){
- str+=list[j].value
- break
- }
- }
- WScript.Echo(str)
- }
复制代码
作者: CrLf 时间: 2014-8-10 20:40
来个纯批:- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (2.txt) do (
- set "str=%%a"
- set "FLAG="
- for /f "tokens=1,2 delims=|" %%b in (1.txt) do (
- if not defined FLAG if "!str:%%b=!" neq "!str!" (
- set "str=!str!|%%c"
- set FLAG=1
- )
- )
- echo !str!
- ))>3.txt
复制代码
作者: xuexilai 时间: 2014-8-10 21:27
回复 3# CrLf
麻烦了哥哥 谢谢你
作者: CrLf 时间: 2014-8-10 23:31
再来个perl- open(IN,'1.txt');
- @text=<IN>;
- close(IN);
-
- foreach (@text){
- chop();
- @ar=split(/\|/,$_);
- $list{@ar[0]}='|'.@ar[1];
- }
-
- open(IN,'2.txt');
- while(chop($line=<IN>)){
- foreach (keys %list){
- if (index($line,$_)>=0) {
- $line .= $list{$_};
- break;
- }
- }
- print $line ."\r\n";
- }
- close(IN);
复制代码
作者: 523066680 时间: 2014-8-11 00:17
- my %hash;
- my @arr;
- my $j;
- foreach ( &loadf("1.txt") ) {
- $hash{$1}=$2 if /(.*)\|(.*)\n/;
- }
-
- open WRT,">:raw:crlf","3.txt" or warn "$!";
- foreach ( &loadf("2.txt") ) {
- foreach $j (keys %hash) {
- if (/^$j/) {
- s/\n?$/\|$hash{$j}\n/;
- print WRT $_;
- }
- }
- }
- close WRT;
-
- sub loadf {
- open READ,"<:raw:crlf", shift or warn "$!";
- @all=<READ>;
- close READ;
- return @all;
- }
复制代码
作者: 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://bathome.net./) |
Powered by Discuz! 7.2 |