| 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『楼 主』:
 [求助]文本比較替換,難度高問的很心虛(附圖內文简体)
 
使用 LLM 解释/回答一下
  
大哥们请体谅小弟架设网站要处理太多文本数据的问题,又是初学者,才刚学会一些基本的批次输出输入,但要处理需要比较文本的问题,完全难倒新手啊 
小弟学习的东西太多太杂,批次处理弄的一个头两个大>< 
请老大哥们发慈悲心帮小老弟看再看一下
 
如下图,请按箭头的数字顺序
  
看完图不明白让小弟解说一下
 
话说从前从前有一个文本叫 index1.log的母亲 
它在外头生了很多个 dat的文本孩子 
这些 dat孩子在外地赚了很多钱 
于是要比对母亲 第一个‖分隔符 之前的帐户,和dat孩子的档名 
如果相同,dat孩子就可以把自己文本内容的 :之前的金钱数额,汇到母亲 第一个‖分隔符的帐户 之后
这样母亲就很开心啦
 所以简单的说:
处理前:
 index1.log文本里,每行以 第一个‖之前的数字和同目录里的 dat档的档名作比较
14724‖‖Windows XP 布景主题精选51 In 1 ‖3‖天武帝‖20071012 181007‖TATATA‖1‖1192178479‖ 
比较和 14724相同的 14724.dat档后,打开14724.dat文本内的 :之前的数字
 87:61.224.135.39 
而这个数字便直接再汇入 index1.log的 第一个‖之后
处理后:
  
14724‖87‖‖Windows XP 布景主题精选51 In 1 ‖3‖天武帝‖20071012 181007‖TATATA‖1‖1192178479‖ 
这难度实在太高了,小弟问的真的心很虚啊,但不问又不知道如何处理上万篇的文本><
 
十分麻烦老大哥帮忙谢谢
 
 Last edited by leo1984 on 2007-11-1 at 03:57 PM ]  
 
    
 
  
 |   
 | 
  2007-11-1 15:43 | 
  
 | 
 | 
 
abcd 
银牌会员
 
     
 
  
  
积分 1436 
发帖 739 
注册 2007-10-11 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
@echo off 
for /f "tokens=1* delims=‖" %%i in (index1.log) do ( 
  if exist "%%i.dat" ( 
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log 
   ) else ( 
     echo %%i‖%%j>>index2.log 
     ) 
) 
pause 
这个意思??
 
 Last edited by abcd on 2007-11-1 at 04:22 PM ]  
 
    
 
  
 |   
 | 
  2007-11-1 16:19 | 
  
 | 
 | 
 
lxmxn 
版主
 
        
 
  
 
积分 11386 
发帖 4938 
注册 2006-7-23 
状态 离线
 | 
 | 
  2007-11-1 18:06 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
Originally posted by abcd at 2007-11-1 04:19 PM: 
@echo off 
for /f "tokens=1* delims=‖" %%i in (index1.log) do ( 
  if exist "%%i.dat" ( 
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>> ... 
  
大哥您不要整我啊 
你一定是在變魔術 
為何您寫的就這麼簡單 
我可想了好半天哪@@"
 
感謝再感謝~願主保佑你~聖誕節快樂加新年快樂~    <<<<這小伙子瘋了  
 
    
 
  
 |   
 | 
  2007-11-1 21:11 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
Originally posted by lxmxn at 2007-11-1 06:06 PM: 
故事讲得很搞笑哦~~ ^_^  
我这么认真在说一个母亲的辛劳与孩子的孝顺 
怎么变庵搞笑来的勒?! @@?  
 
    
 
  
 |   
 | 
  2007-11-1 21:15 | 
  
 | 
 | 
 
terse 
银牌会员
 
     
 
  
  
积分 2404 
发帖 946 
注册 2005-9-8 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
改上面的试一下也一样 
不过没有%%i.dat文件就不行了哦  呵呵  学习了 
@echo off 
for /f "tokens=1* delims=‖" %%i in (index1.log) do ( 
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index.log 
) 
pause 
 
 Last edited by terse on 2007-11-1 at 10:22 PM ] 
 
    
 
  
 |   
 | 
  2007-11-1 22:06 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
@echo off 
for /f "tokens=1* delims=∥" %%i in (index2.log) do ( 
for /f "tokens=5 delims=∥" %%a in (%%i.txt) do echo %%i∥%%a∥%%j>>index.log 
) 
 
我要抓取第五個∥字符 
但是 
for /f "tokens=5 delims=∥" %%a in (%%i.txt) do echo %%i∥%%a∥%% 
這段tokens=5會把第五個字串抓出來,但是迴圈會繼續下去,因此連文本後面的的一起輸出來到index.log裡 
 
請問為何同樣的寫法,tokens=5設為1時,就只會偵對第一行抓取 
但設為5時,迴圈為何會繼續抓下去呢? 
 
可以下載的的附件測試看,小老弟看的很困惑這是什麼魔法? 
 
 Last edited by leo1984 on 2007-11-2 at 04:02 AM ] 
 
    
 
  
附件
1:   14536.txt (2007-11-2 04:01, 2.69 KiB,下载次数: 6)
 
 
 |   
 | 
  2007-11-2 04:01 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
完了 
研究整個晚上指令 
只有skip只能指定跳過開頭幾行 
沒有辦法直接指定第一行0.0"   (心頭一陣寒風吹過~~~~) 
 
    
 
  
 |   
 | 
  2007-11-2 06:41 | 
  
 | 
 | 
 
abcd 
银牌会员
 
     
 
  
  
积分 1436 
发帖 739 
注册 2007-10-11 
状态 离线
 | 
 | 
  2007-11-2 10:45 | 
  
 | 
 | 
 
terse 
银牌会员
 
     
 
  
  
积分 2404 
发帖 946 
注册 2005-9-8 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
是不是这个意思呢? 
附件下来我这里是乱码,没测试!
  
@echo off 
for /f "tokens=1* delims=‖" %%i in (index2.log) do ( 
set i=%%i 
call :doc 
) 
pause 
goto :eof 
:doc 
for /f "tokens=5 delims=‖" %%a in (%i%.txt) do ( 
  if not defined line set "line=%%a" 
) 
echo,%line%>>indexa.log 
set line= 
  
 
    
 
  
 |   
 | 
  2007-11-2 10:48 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
『第 11 楼』:
 
 
使用 LLM 解释/回答一下
  
给abcd大哥 
这个很难用图片来说明@@"
 
我来简单说明一下好了,我原本提供的图里,知道了 dat里头只要取出 87放到 index1.log即可
 http://img155.imageshack.us/img155/5489/snap085dz5.jpg
所以您给的
 for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log
找到 :这个分隔符后,因为 bat文本里头 只有一行
所以这段回圈也 只能执行一次
但是小老弟我这次要从 txt文本里取出第五个以 ‖为分隔符的字串,然后一样放到index2.log里
 
所以我修改成
   for /f "tokens=5 delims=‖" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log
但是我们都知道 回圈会不停不停的执行
而这次 txt的文本里 不只有一行
他是这样子
 JAN‖1‖SlySoft All In One 2007-09-10-小绵羊套餐‖绵羊狐狸又来了@1@,这是一定要收下的啦,谢啦<br>‖220.132.11.106‖2007/09/18/ 11:10:02‖jan@yahoo.com‖
...........
 
..........以此类推可能有好几行
 
因此 txt文本里头有几行,它就取出多少行的字串到index2.log里
 
原本小弟需要的 index2.log一行比较 dat只有一行后取出 一个字串放到 index2.log里,是可行的
 
而这次 index2.log一行比较 txt有许多行后取出 许多字串放到 index2.log里,就不符合一比一的取字串的需求了
 
因此我说如何能让回圈指定只取 txt第一行,就停止再取超过第一行的字串,但因为找不到指令而小弟很心寒
 
而感谢 terse提供的指令,小老弟平常接触的都是变数和回圈等等网站程式,没想到原来DOS可以口语话的进行比较
 if not defined line  set "line=%%a"
只要和 line一样的才能进行回圈 
同时也宣告 line=%%a
但重点来啦~没有排出阵列,只取出%%a进行比较后输出 
因此
 
处理前, txt文本里的确实取出 220.132.11.106这字串了
 JAN‖1‖SlySoft All In One 2007-09-10-小绵羊套餐‖绵羊狐狸又来了@1@,这是一定要收下的啦,谢啦<br>‖220.132.11.106‖2007/09/18/ 11:10:02‖jan@yahoo.com‖
但放到 index2.log原本需要的是这样
 
处理后:
 3041‖220.132.11.106‖1489‖‖【2-25】Nelson 软 体 作 品(全是繁体中文的喔)‖2‖琉璃★幻童‖20070914 061000‖琉璃★幻童 ‖1‖1185452828‖
但是因为输出只有宣告
 echo,%line%>>indexa.log
所以变成只留下
 220.132.11.106
其他原本应有的字串变成被 220.132.11.106取代掉了
 
所以小弟的苦恼是terse大哥确实宣告一定要比较过 %%a才能取出字串,但是不能排出阵列啊@@
 
请老大哥再帮忙小老弟 
(超高难度的,不是小老弟不认真学,只是搜索整个论坛,也找不到for能够指定第一行执行一次就停止的指令,这老弟还在研究中啊@@)
 
 Last edited by leo1984 on 2007-11-2 at 12:18 PM ]  
 
    
 
  
 |   
 | 
  2007-11-2 12:02 | 
  
 | 
 | 
 
leo1984 
初级用户
 
  
 
  
  
积分 96 
发帖 43 
注册 2007-10-31 
状态 离线
 | 
 | 
  2007-11-2 12:10 | 
  
 | 
 | 
 
abcd 
银牌会员
 
     
 
  
  
积分 1436 
发帖 739 
注册 2007-10-11 
状态 离线
 | 
 | 
  2007-11-2 12:18 | 
  
 | 
 | 
 
abcd 
银牌会员
 
     
 
  
  
积分 1436 
发帖 739 
注册 2007-10-11 
状态 离线
 | 
 | 
  2007-11-2 12:19 | 
  
 | 
 | 
 
junchen2 
高级用户
 
    
 
  
  
积分 537 
发帖 219 
注册 2007-8-4 来自 杭州--半山 
状态 离线
 | 
『第 15 楼』:
 
 
使用 LLM 解释/回答一下
  
for /f "tokens=5 delims=‖" %%a in ('sed -n 1p %%i.dat') do echo %%i‖%%a‖%%j>>index2.log 
 
    
 
  
 |   
 | 
  2007-11-2 12:22 | 
  
 |