Board logo

标题: [文本处理] [已解决] 批处理如何从多个文本逐行读取内容组合合并 [打印本页]

作者: fanfande    时间: 2010-8-5 23:35     标题: [已解决] 批处理如何从多个文本逐行读取内容组合合并

本帖最后由 pcl_test 于 2017-6-6 19:43 编辑

因为工作需要,做公司做论坛活动,一个关于文本的批量替换生成处理,恳请得到大家的帮助!

问题是这样的:

同一文件夹下有3个文本文件:

一个文本文件内是全国大小城市名称,(由自己整理一行一个依次排列,文本命名为:A.txt)!
一个文本文件内是N多歇后语,也是,(由自己整理一行一个依次排列,文本命名为:B.txt)!
一个文本文件内是举例文本文件文本命名为C.txt  , 文本打开里面的范文内容形如下面这个例子:

上海聊天论坛开通,欢迎上海的朋友前来捧场
告诉大家一个好消息,期待已久的上海聊天论坛备案成功已经开通了,欢迎上海的朋友前来捧场,我们特地在上海市中心设定一个团购接待点,届时期待上海论坛通告!


为了能使得大家很好的理解,我举一个例子说明一下,最后的运行下来一个其中一个结果差不多应该是这样的,大家注意我加粗的字:

八仙过海,各显神通北京聊天论坛开通,欢迎北京的朋友前来捧场
告诉大家一个好消息,期待已久的北京聊天论坛备案成功已经开通了,欢迎北京的朋友前来捧场,我们特地在北京市中心设定一个团购接待点,届时期待北京论坛通告!

其中,八仙过海,各显神通 来自第2个文本文件里面的随机一行歇后语然后“上海”替换成了“北京”这个是由第一个文本文档里面的城市名决定的!

最后生成多少结果,视第一个文本文件里面有多少行,在这里意思就是第一个文本文档里面有多少个城市最后就生成多少个txt,方便管理,生成的新的txt可以生成在该文件夹的新建文件夹里面,我们把它命名为newtxt

如下我做了个截图:






二楼你好,那个只是我举个例子而已,不是你想象中那么恶劣哦 .不过还是谢谢你,不是你,还真被很多人误解呢?  致二楼 :

一个帖子,可能给你带来非常好的思路,
一个帖子,可能给你带来非常好的合作机会。
一个帖子,可以让你更快速的了解互联网的最新信息。并参与其中 ,有收获有乐趣。




[]

[ 本帖最后由 fanfande 于 2010-8-9 01:17 编辑 ]
作者: cjiabing    时间: 2010-8-6 00:28

你慢慢回家替换去吧,最讨厌这种到处乱发帖的家伙1~
作者: fanfande    时间: 2010-8-6 23:37

果然被二楼把我卖光了.一天了只有看的却没有回复的,二楼我恨你 !

[ 本帖最后由 fanfande 于 2010-8-6 23:57 编辑 ]
作者: fanfande    时间: 2010-8-6 23:38

一个帖子,可能给你带来非常好的思路,
一个帖子,可能给你带来非常好的合作机会。
一个帖子,可以让你更快速的了解互联网的最新信息。并参与其中 ,有收获有乐趣。


恳请大家互相帮助 !帮助了别人, 快乐了自己
作者: 随风    时间: 2010-8-7 00:31

这个帖子晒了这么久都没人来解决,楼主想过自己的原因吗
本来不想回的,看你等了这么久,还是回回吧
相信论坛很多人都和我一样,最讨厌需要不停反问楼主才能搞清楼主的具体要求或已知条件。
你的c.txt中,歇后语和城市名是如何区分的?
歇后语都是八个字吗?
歇后语都是每四个字后面有一个逗号吗?
城市名都是两个字吗?
随机替换,允许有重复的歇后语或城市名吗?

最后,你这个好像有点貌似广告?
作者: fanfande    时间: 2010-8-7 01:50

随风版主,我是一名电子产品销售员,虽然我是销售,但是我对互联网的热爱,不仅仅是限于逛逛论坛,灌灌水,我平时抽空自己做网站玩,纯粹是兴趣 !自身有很多不足之处请谅解!

①A.TXT  里面大体这样的,一行一个,每行没数字限制,下面是若干举例:

上海
北京
深圳
天津
广州
香港
南京
苏州
杭州
......等等城市名称!




②B.txt 里面是一些常用短语.也是一行一个,每行也没有数字限制,下面是若干举例:

金玉其外败絮其中
八仙过海各显神通
经验比理论来得实在
有则改之无则加勉
......等等类似的常用语!


③C.txt 里面就是一个范文,第一行是正文标题,从第2行开始是正文,这里我只是举例,不是和大家理解的那样我乱贴广告的,范文形式形如:

上海聊天论坛开通,欢迎上海的朋友前来捧场
告诉大家一个好消息,期待已久的上海聊天论坛备案成功已经开通了,欢迎上海的朋友前来捧场,我们特地在上海市中心设定一个团购接待点,届时期待上海论坛通告!


目的就是用A.TXT里面的每个城市名称依次替换范文里面的  上海
然后在标题前面再加上一个常用短语,最后生成若干新的txt,生成的个数由A文件里面的城市名个数决定,生成的txt文件名就以各自的城市名为txt命名吧!

下面我抽出一个结果给大家看一下:

八仙过海,各显神通,北京聊天论坛开通,欢迎北京的朋友前来捧场 (正如随风所言,确实是常用语后面一个逗号)
告诉大家一个好消息,期待已久的北京聊天论坛备案成功已经开通了,欢迎北京的朋友前来捧场,我们特地在北京市中心设定一个团购接待点,届时期待北京论坛通告!

大家注意到正文标题前面多了一个B.txt里面随机而来的常用短语,这里常用短语不重复最好!
然后正文里面的各自的城市被A.TXT里面的城市名替换掉了.

最后将生成好的各自文件(如:上海.txt 北京.txt  深圳.txt  南京.txt )放在newtxt这个文件夹里面.



大体意思就是这样的! 再次表示感谢! 我这个帖子没有丝毫广告的意思,我是认真的,希望能得到大家的理解认可 !

[ 本帖最后由 fanfande 于 2010-8-7 02:00 编辑 ]
作者: 随风    时间: 2010-8-7 02:14

换种说法
就是说新生成的文件正文内容都是一样的吗?除了你说的歇后语和城市名有变化以外

八仙过海,各显神通,北京聊天论坛开通,欢迎北京的朋友前来捧场
告诉大家一个好消息,期待已久的北京聊天论坛备案成功已经开通了,欢迎北京的朋友前来捧场,我们特地在北京市中心设定一个团购接待点,届时期待北京论坛通告!
作者: fanfande    时间: 2010-8-7 02:31

是的,大家都这么晚啊,还看到好多人在线,大家辛苦啊!

新生成的txt和范文的区别就是城市名发生变化
同时,正文标题最前面被添加了随机不重复的常用语!

新生成的txt放置在newtxt文件夹里面,生成的个数由A.txt里面的城市名个数决定,也就是多少行就生成多少个
生成的txt命名方式就用各自的城市名命名吧!
作者: caruko    时间: 2010-8-7 02:58

  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /a x=0
  3. for /f "delims=*" %%a in (b.txt) do set "_!x!=%%a" & set  /a x+=1
  4. for /f "delims=*" %%a in (a.txt) do (
  5.        set /a r=!random!%%!x!
  6.         echo;%_!r!%,%%a聊天论坛开通,欢迎%%a的朋友前来捧场!>>newtxt\%%a.txt
  7.     echo;告诉大家一个好消息,期待已久的%%a聊天论坛备案成功已经开通了,欢迎%%a的朋友前来捧场,我们特地在%%a市中心设定一个团购接待点,届时期待%%a论坛通告!>>newtxt\%%a.txt
  8. )
复制代码

作者: fanfande    时间: 2010-8-7 03:07

caruko你好

最好让bat读取c.txt 因为那样可编辑余地更大!

这里存在一个问题,我广告测试了一下

好像不能够将b.txt里面的常用语加到正文标题的前面

诸如:


八仙过海,各显神通,北京聊天论坛开通,欢迎北京的朋友前来捧场
作者: fanfande    时间: 2010-8-7 03:09

请问,假使要让批处理 得到的结果

正文标题前面随机的常用短语都不重复的话

是不是要b.txt的行数,大于a.txt的行数
作者: caruko    时间: 2010-8-7 03:54

把echo;%_!r!% 改成call echo;%%_!r!%%就可以了。

如果另写一个C.txt,循环读取会影响效率。
而且是多行文本,就算设成变量,也要多N个循环。N=城市数*C.txt行数

所以不如直接写在bat里,或者这样。另外a.txt 最好不要有空行。
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /a x=0
  3. for /f "delims=*" %%a in (b.txt) do set "_!x!=%%a" & set  /a x+=1
  4. for /f "delims=*" %%a in (a.txt) do (
  5.        set /a r=!random!%%x
  6.        call :msg %%_!r!%% %%a >>newtxt\%%a.txt
  7. )
  8. :msg
  9. echo;%1,%2聊天论坛开通,欢迎%2的朋友前来捧场!
  10. echo;告诉大家一个好消息,期待已久的%2聊天论坛备案成功已经开通了,欢迎%2的朋友前来捧场,我们特地在%2市中心设定一个团
  11. 购接待点,届时期待%2论坛通告!
复制代码

作者: fanfande    时间: 2010-8-7 12:18

3ks大家的帮忙,而且我发现大家和我一样都非常晚睡觉,哈哈
caruko 我给你发了个论坛短消息,收到了吗??
作者: fanfande    时间: 2010-8-7 12:25

caruko你好,麻烦帮我出个完整的,从c.txt调用的那种  
我看了你的回复,那么晚还在,真谢谢你!

直接将c的内容写在bat里面有弊端,那就是可编辑性比较小,忽略效率的问题的话,可以帮我出个完整的bat吗.?我还是将范文放在c.txt里面!

谢谢了!周末愉快
作者: 随风    时间: 2010-8-8 11:13

如果方便的话,最好给出c.txt的全部内容
作者: ZJHJ    时间: 2010-8-8 17:33

不是人家不帮你,是人家不好帮你。
原因是你太罗嗦还没有把问题讲清楚。
你把A 、B 、C 的范例给出..........
作者: fanfande    时间: 2010-8-8 22:07

随风版主你好,其实我的范文在 6楼已经大致给出来了!
C.txt就是一个里面包括了即一个"即将被替换的文本" , 核心就是这个 "即将被替换的文本" ,我说让c.txt调用而不是把内容放在bat里面就是想让c.txt更加可编辑性!

比如c.txt 是如下内容

111111111111111111"即将被替换的文本"22222222222222222"即将被替换的文本"33333333333333333


就是让bat处理用a.txt里面的文本去依次替换并生成新的txt

我也将a.txt和b.txt再把举例的写出来吧:

①A.TXT  里面大体这样的,一行一个,每行没数字限制,下面是若干举例:

上海
北京
深圳
天津
广州
香港
南京
苏州
杭州
......等等城市名称!

②B.txt 里面是一些常用短语.也是一行一个,每行也没有数字限制,下面是若干举例:

金玉其外败絮其中
八仙过海各显神通
经验比理论来得实在
有则改之无则加勉
......等等类似的常用语!


Ps:我测试下来,9楼的caruko大哥的是成功的! 不足之处就是把c.txt内容放置在bat里面,没有单独调用让c.txt更加具有可编辑性!

谢谢大家
作者: 随风    时间: 2010-8-8 22:35

唉~~~
既然楼主只能交代这么多已知条件,就试着写写吧
代码条件
1、a、b、c、文本中不能含半角感叹号
2、c.txt 第一行为标题,即:在这一行前面随机加入b.txt的行,c.txt从第二行起开始替换城市名,需注意的是,比如替换的是“北京”那么c.txt中的所有“北京”词组都会替换掉,不管在正文中它是不是城市名都会被替换
3、c.txt中的空行会被忽略
4、c.txt中的第一行“聊天”前面的字符为需替换的城市名
代码未测试,有问题跟帖。。。
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. if not exist newtxt\ md newtxt
  3. for /f "delims=" %%a in (b.txt) do (
  4.    set /a n+=1&set ".!n!=%%a"
  5. )
  6. for /f "delims=" %%a in (a.txt) do (
  7.    set /a w=!random!%%n+1,m=1
  8.    for /f "delims=" %%b in (c.txt) do (
  9.   set num=%%b
  10.       if !m! equ 1 (
  11.      for /f "delims=聊" %%I in ("%%b") do set "m=%%I"
  12. for /f "delims=" %%D in ("!m!") do set num=!num:%%D=%%a!
  13.          for %%i in (!w!) do echo !.%%i!,!NUM!>"newtxt\%%a.txt"
  14.          ) else (
  15.    for /f "delims=" %%D in ("!m!") do set num=!num:%%D=%%a!
  16.    echo !Num!>>"newtxt\%%a.txt"
  17.    )
  18. )
  19. )
  20. start newtxt
复制代码

作者: fanfande    时间: 2010-8-8 23:12

哎,还是你们思维比较缜密,我到现在才明白为啥让我把c.txt写的更加完善点的用途了!

随风版主,上面的测试完全没有问题,但是,确实因为我的疏忽,所以我明白你为啥要指定一个 "聊" 为特定字符了!
我现在反过来给你指定 即将被替换的文本为  "指定替换"  ! 也就是说c.txt里面无论标题或者正文只要碰到 "指定替换"  他就按a.txt里面的逐一替换!


这样c.txt形如如下范文:
111111111111指定替换22222222222 →这里是标题
3333333333333指定替换44444444指定替换555555555指定替换66666666指定替换77777777指定替换99999 →这里是正文

这样就不要指定标题具体到哪个字前面需要替换了,是吗?

谢谢随风大哥的帮忙


相信你明白我意思了,再麻烦你一下!有问题我在线到继续跟帖。。。
作者: 随风    时间: 2010-8-8 23:42

  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. if not exist newtxt\ md newtxt
  3. set var=指定替换
  4. set /p str=<c.txt
  5. for /f "delims=" %%a in (b.txt) do set /a n+=1&set ".!n!=%%a"
  6. for /f "delims=" %%a in (a.txt) do (
  7.    set /a w=!random!%%n+1
  8.    for %%i in (!w!) do echo !.%%i!,!str:%var%=%%a!>"newtxt\%%a.txt"
  9.    for /f "skip=1 delims=" %%b in (c.txt) do (
  10.       set num=%%b
  11.       set num=!num:%var%=%%a!
  12.       echo !Num!>>"newtxt\%%a.txt"
  13.     )
  14. )
  15. start newtxt
复制代码

作者: fanfande    时间: 2010-8-9 01:15

3ks 随风,你是最棒的!
晚安!




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