Board logo

标题: [文本处理] [已解决]批处理如何根据文本内的指定字符串将相关内容生成txt文本并分类存? [打印本页]

作者: hbb    时间: 2014-1-3 11:30     标题: [已解决]批处理如何根据文本内的指定字符串将相关内容生成txt文本并分类存?

本帖最后由 pcl_test 于 2016-7-3 19:47 编辑

我有个“频道列表.txt”文件,文件内容如下
{央视频道}
CCTV1综合,218.24.47.44/CCTV1.m3u8
CCTV1综合,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv1&type=ipad
CCTV1综合,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv1&type=ipad
CCTV1综合,rtmp.cntv.lxdns.com/live/cctv1/playlist.m3u8
CCTV2财经,218.24.47.44/CCTV2.m3u8
CCTV2财经,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv2&type=ipad
CCTV2财经,218.24.47.44/CCTV2.m3u8
CCTV2财经,rtmp.cntv.lxdns.com/live/cctv2/playlist.m3u8
CCTV3综艺,stream1.gzcbn.tv:1935/app_2/ls_3.stream/playlsit.m3u8?session=jyb321123
CCTV3综艺,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv3&type=ipad
CCTV3综艺,116.199.127.68/cctv3
CCTV3综艺,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv3&type=ipad
{地方卫视}
北京卫视,live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_tv
北京卫视,tvie01.ucatv.com.cn/channels/xjyx/BeiJing-HD-Suma/flv:BJ_HD_Suma
北京卫视,web-play.pptv.com/web-m3u8-300166.m3u8?type=m3u8.web.pad
东方卫视,zb.v.qq.com:1863/?progid=3900155972
东方卫视,live.gslb.letv.com/gslb?stream_id=dongfang&tag=live&ext=m3u8&sign=live_tv
广东卫视,zb.v.qq.com:1863/?progid=857894899
广东卫视,zb.v.qq.com:1863/?progid=857894899
广东卫视,live.gslb.letv.com/gslb?stream_id=guangdong&tag=live&ext=m3u8&sign=live_tv

通过批处理遍历“频道列表.txt”文件,实现如下功能:
1、遇见中括号内的内容如“{央视频道}”,就通过批处理新建“央视频道”的文件夹,并把此类别下的链接生成txt文件,存放到分类文件夹下
2、然后分类的内容如“CCTV1综合,218.24.47.44/CCTV1.m3u8”就生成“CCTV1综合.txt”文件,“CCTV1综合.txt”文件内容为“218.24.47.44/CCTV1.m3u8”
3、由于分类包含的内容有重复,如“CCTV1综合”,遇到第2个重复的即在生成的"CCTV1综合.txt"后面自动累加个数字“_1”变成"CCTV1综合_1.txt",以此类推,第3个就变成"CCTV1综合_2.txt"

请各位朋友们帮忙看看如何写,谢谢!
作者: apang    时间: 2014-1-3 15:54

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (List.txt) do (
  3.     set "str=%%a"
  4.     if "!str:~,1!"=="{" (
  5.         if "!str:~-1!"=="}" set "fd=!str:~1,-1!"
  6.     ) else (
  7.         if defined fd if not exist "!fd!\" md "!fd!\"
  8.         for /f "tokens=1*delims=," %%b in ("%%a") do (
  9.             set "Name=%%b" & set "url=%%c" & set "n="
  10.             call :Lp "!Name!"
  11.         )
  12.     )
  13. )
  14. pause & exit /b
  15. :Lp
  16. if exist "!fd!\!Name!.txt" set /a n+=1 & set "Name=%~1_!n!" & goto :Lp
  17. echo,!url!>"!fd!\!Name!.txt"
复制代码

作者: hbb    时间: 2014-1-3 16:07

膜拜你,大神,谢谢!!
作者: apang    时间: 2014-1-3 16:49

本帖最后由 apang 于 2014-1-3 18:24 编辑

来个vbs,不call了
  1. Set fso = Createobject("Scripting.FileSystemObject")
  2. Set file = fso.OpenTextFile("List.txt")
  3. Do Until file.AtEndOfStream
  4.     strLine = Trim(file.ReadLine)
  5.     If Left(strLine,1) = "{" and Right(strLine,1) = "}" Then
  6.         strFD = Mid(strLine,2,Len(strLine)-2)
  7.         If Not fso.FolderExists(strFD) Then
  8.             fso.CreateFolder strFD
  9.         End If
  10.     ElseIf strLine <> "" Then
  11.         strName = Left(strLine,InStr(strLine,",")-1)
  12.         strUrl = Right(strLine,Len(strLine)-InStr(strLine,","))
  13.         strNewName = strName & ".txt"
  14.         i = 0
  15.         while fso.FileExists(strFD & "\" & strNewName)
  16.             i = i + 1
  17.             strNewName = strName & "_" & i & ".txt"
  18.         wend
  19.         fso.CreateTextFile(strFD & "\" & strNewName,true).Write strUrl
  20.     End If
  21. Loop
复制代码

作者: 1270697389    时间: 2014-1-3 18:19

apang 发表于 2014-1-3 15:54



    你这个可以不用call吗?或者
  1. if exist "!fd!\!Name!.txt" set /a n+=1 & set "Name=%~1_!n!" & goto :Lp
  2. echo,!url!>"!fd!\!Name!.txt"
复制代码
这一段能解释一下吗?
作者: apang    时间: 2014-1-3 18:57

本帖最后由 apang 于 2014-1-3 19:06 编辑

回复 5# 1270697389


    不用call没想到好办法,以下代码文件名(如:CCTV1综合)不能含空格,也不能含!符号。
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (List.txt) do (
  3.     set "str=%%a"
  4.     if "!str:~,1!"=="{" (
  5.         if "!str:~-1!"=="}" set "fd=!str:~1,-1!"
  6.     ) else (
  7.         if defined fd (
  8.             if not exist "!fd!\" md "!fd!\"
  9.             for /f "tokens=1*delims=," %%b in ("%%a") do (
  10.                 if not defined .%%b (
  11.                     set ".%%b=0" & echo,%%c>"!fd!\%%b.txt"
  12.                 ) else set /a .%%b+=1 & echo,%%c>"!fd!\%%b_!.%%b!.txt"
  13.             )
  14.         )
  15.     )
  16. )
  17. pause
复制代码

作者: hbb    时间: 2014-1-3 22:48     标题: 【已解决】BAT批处理如何处理文本内容,按固定格式分类存放文件?

本帖最后由 hbb 于 2014-1-4 21:56 编辑

我有个“频道列表.txt”文件,文件内容如下
{央视频道}
CCTV1综合,218.24.47.44/CCTV1.m3u8
CCTV1综合,218.24.47.44/CCTV1.m3u9
CCTV1综合,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv1&type=ipad
CCTV1综合,rtmp.cntv.lxdns.com/live/cctv1/playlist.m3u8
CCTV2财经,218.24.47.44/CCTV2.m3u8
CCTV2财经,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv2&type=ipad
CCTV2财经,218.24.47.44/CCTV2.m3u8
CCTV2财经,rtmp.cntv.lxdns.com/live/cctv2/playlist.m3u8
CCTV3综艺,stream1.gzcbn.tv:1935/app_2/ls_3.stream/playlsit.m3u8?session=jyb321123
CCTV3综艺,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv3&type=ipad
CCTV3综艺,116.199.127.68/cctv3
CCTV3综艺,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv3&type=ipad
{地方卫视}
北京卫视,live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_tv
北京卫视,tvie01.ucatv.com.cn/channels/xjyx/BeiJing-HD-Suma/flv:BJ_HD_Suma
北京卫视,web-play.pptv.com/web-m3u8-300166.m3u8?type=m3u8.web.pad
东方卫视,zb.v.qq.com:1863/?progid=3900155972
东方卫视,live.gslb.letv.com/gslb?stream_id=dongfang&tag=live&ext=m3u8&sign=live_tv
广东卫视,zb.v.qq.com:1863/?progid=857894899
广东卫视,zb.v.qq.com:1863/?progid=857894899
广东卫视,live.gslb.letv.com/gslb?stream_id=guangdong&tag=live&ext=m3u8&sign=live_tv

通过批处理遍历“频道列表.txt”文件,实现如下功能:
1、遇见中括号内的内容如“{央视频道}”,就通过批处理新建“央视频道”的文件夹,并把此类别下的链接生成txt文件,存放到分类文件夹下
2、然后分类的内容如“CCTV1综合,218.24.47.44/CCTV1.m3u8”就生成“CCTV1综合.txt”文件,“CCTV1综合.txt”文件内容为
“<Entry> <Title>CCTV1综合_源01</Title> <Ref href = "218.24.47.44/CCTV1.m3u8"/> </Entry>”
3、由于分类包含的内容有重复,如“CCTV1综合”,遇到第2个重复的即在生成的"CCTV1综合.txt"文件内容中添加新的行
“<Entry> <Title>CCTV1综合_源02</Title> <Ref href = "218.24.47.44/CCTV1.m3u9"/> </Entry>”
格式中,源的数字是自动累加的,由“CCTV1综合_源01”变成"CCTV1综合_源02",以此类推,第3个就变成"CCTV1综合_源03"

最后生成的“CCTV1综合.txt”文本内容格式如下:
<Entry> <Title>CCTV1综合_源01</Title> <Ref href = "218.24.47.44/CCTV1.m3u8"/> </Entry>
<Entry> <Title>CCTV1综合_源02</Title> <Ref href = "218.24.47.44/CCTV1.m3u9"/> </Entry>
.................以此类推

请各位朋友们帮忙看看如何写,谢谢!
作者: apang    时间: 2014-1-4 14:21

保存为bat,用记事本打开后会变成utf-8格式,“源”变成乱码,不知道是否传说中的“联通”问题
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (List.txt) do (
  3.     set "str=%%a"
  4.     if "!str:~,1!"=="{" (
  5.         if "!str:~-1!"=="}" set "fd=!str:~1,-1!" & md "!fd!\" 2>nul
  6.     ) else (
  7.         for /f "tokens=1*delims=," %%b in ("!str!") do (
  8.             set /a ".!fd!.%%b+=1"
  9.             for %%d in (!fd!) do set "a=00!.%%d.%%b!"
  10.             >>"!fd!\%%b.txt" echo,^<Entry^> ^<Title^>%%b_源!a:~-2!^</Title^> ^<Ref href = "%%c"/^> ^</Entry^>
  11.         )
  12.     )
  13. )
  14. pause
复制代码
vbs,保存为unicode格式好了
  1. Set fso = Createobject("Scripting.FileSystemObject")
  2. Set dic = CreateObject("Scripting.Dictionary")
  3. Set file = fso.OpenTextFile("List.txt")
  4. Do Until file.AtEndOfStream
  5.     strLine = Trim(file.ReadLine)
  6.     If Left(strLine,1) = "{" and Right(strLine,1) = "}" Then
  7.         strFD = Mid(strLine,2,Len(strLine)-2)
  8.         If Not fso.FolderExists(strFD) Then
  9.             fso.CreateFolder strFD
  10.         End If
  11.     ElseIf strLine <> "" Then
  12.         strName = Left(strLine,InStr(strLine,",")-1)
  13.         strUrl = Right(strLine,Len(strLine)-InStr(strLine,","))
  14.         strKey = strFD & "\" & strName
  15.         If dic.Exists(strKey) Then
  16.             dic.Item(strKey) = dic.Item(strKey) + 1
  17.         Else dic.Add strKey,101
  18.         End If
  19.         s = "_源" & Right(dic.Item(strKey),2)
  20.         s = "<Entry> <Title>" & strName & s & "</Title> <Ref href = "
  21.         s = s & chr(34) & strUrl & chr(34) &"/> </Entry>"
  22.         fso.OpenTextFile(strKey & ".txt",8,true).WriteLine s
  23.     End If
  24. Loop
复制代码

作者: 1270697389    时间: 2014-1-4 16:58

保存为bat,用记事本打开后会变成utf-8格式,“源”变成乱码,不知道是否传说中的“联通”问题vbs,保存为u ...
apang 发表于 2014-1-4 14:21



    你的bat没有问题,要保存为ANSI格式的bat就没有问题了。
作者: terse    时间: 2014-1-4 17:23

回复 2# apang
我上次遇到的是  "系统" 两字
应该是编码问题
作者: hbb    时间: 2014-1-4 17:41

本帖最后由 hbb 于 2014-1-4 17:48 编辑

首先感谢apang大神的热心解答,在使用过程中,出现了如下问题,执行bat批处理时,list.txt文本包含如下内容:

{央视频道}
CCTV4中文国际(亚洲),live.gslb.letv.com/gslb?stream_id=cctv4&tag=live&ext=m3u8&sign=live_tv
CCTV5+体育赛事,vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctvgaoqing&type=ipad

的时候报如下错误:
运算符不存在。
找不到操作数。
请按任意键继续. . .

执行完后,源的数字会变成00,请问如何解决,谢谢!
作者: tianyaoxing    时间: 2014-1-4 17:52

回复 2# apang


   高手能不能解释一下 set /a ".!fd!.%%b+=1"中的.号的作用啊,头都想炸了
作者: apang    时间: 2014-1-4 19:20

回复 4# terse


    确实。
愚蠢的notepad.exe,我再多加一行中文注释就不乱码了:Rem 嘿嘿
作者: apang    时间: 2014-1-4 19:24

回复 5# hbb


    批处理这样写是没有考虑通用性的,如果你不讨厌vbs的话,试试第二个代码
作者: hbb    时间: 2014-1-4 19:46

回复 8# apang


    vbs运行也会报错,不太懂,不方便调试,不知apang兄能再调一调bat吗?谢谢!
作者: apang    时间: 2014-1-4 20:06

回复 9# hbb


    你把vbs和bat运行报错的文本打包传上来,我试试看
作者: hbb    时间: 2014-1-4 20:30

回复 10# apang

[attach]6989[/attach]
作者: apang    时间: 2014-1-4 20:43

回复 11# hbb


    最后一行为{},即文件夹名为空,所以报错。第9行这样改:
  1.         If strFD <> "" and Not fso.FolderExists(strFD) Then
复制代码

作者: hbb    时间: 2014-1-4 20:47

本帖最后由 hbb 于 2014-1-4 20:56 编辑

回复 12# apang

vbs调试没问题了,真心喜欢bat的批处理
apang兄能改下bat吗?
报如下错误:
运算符不存在。
找不到操作数。
作者: hbb    时间: 2014-1-4 21:03

还有,我想在生成的每个txt文件内的一头一尾添加以下两行
<Asx Version = "3.0">
</Asx>
最后生成的“CCTV1综合.txt”文本内容格式如下:
<Asx Version = "3.0">
<Entry> <Title>CCTV1综合_源01</Title> <Ref href = "218.24.47.44/CCTV1.m3u8"/> </Entry>
<Entry> <Title>CCTV1综合_源02</Title> <Ref href = "218.24.47.44/CCTV1.m3u9"/> </Entry>
</Asx>
请问批处理应该怎么修改?谢谢!
作者: apang    时间: 2014-1-4 21:53

回复 14# hbb


    话说,为何顶楼不一次性说清楚呢?修改下vbs,此帖我不再回复
  1. Set fso = Createobject("Scripting.FileSystemObject")
  2. Set dic1 = CreateObject("Scripting.Dictionary")
  3. Set dic2 = CreateObject("Scripting.Dictionary")
  4. Set file = fso.OpenTextFile("List.txt")
  5. Do Until file.AtEndOfStream
  6.     strLine = Trim(file.ReadLine)
  7.     If Left(strLine,1) = "{" and Right(strLine,1) = "}" Then
  8.         strFD = Mid(strLine,2,Len(strLine)-2)
  9.     ElseIf strLine <> "" and strFD <> "" Then
  10.         If Not fso.FolderExists(strFD) Then
  11.             fso.CreateFolder strFD
  12.         End If
  13.         strName = Left(strLine,InStr(strLine,",")-1)
  14.         strUrl = Right(strLine,Len(strLine)-InStr(strLine,","))
  15.         strKey = strFD & "\" & strName
  16.         If dic1.Exists(strKey) Then
  17.             dic1.Item(strKey) = dic1.Item(strKey) + 1
  18.         Else
  19.             dic1.Add strKey,101
  20.         End If
  21.         s = "_源" & Right(dic1.Item(strKey),2)
  22.         s = "<Entry> <Title>" & strName & s & "</Title> <Ref href = "
  23.         s = s & chr(34) & strUrl & chr(34) &"/> </Entry>"
  24.         If dic2.Exists(strKey) Then
  25.             dic2.Item(strKey) = dic2.Item(strKey) & vbcrLf & s
  26.         Else
  27.             dic2.Add strKey,"<Asx Version = ""3.0"">" & vbCrLf & s
  28.         End If
  29.     End If
  30. Loop
  31. For Each a in dic2.Keys
  32.     fso.OpenTextFile(a & ".txt",2,true).Write dic2.Item(a) & vbCrLf & "</Asx>"
  33. Next
  34. MsgBox "OK"
复制代码

作者: hbb    时间: 2014-1-4 21:56

本帖最后由 hbb 于 2014-1-4 21:57 编辑

回复 15# apang


    万分感谢,我本想自己学着修改来着,可是能力有限,所以才一点点的提出,膜拜膜拜!
作者: seewater    时间: 2014-2-3 11:26

请问 在这一行: set ".%%b=0" & echo,%%c>"!fd!\%%b.txt"
为什么用 .%%b
为什么用 .




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