标题: [文本处理] 批处理对文本变量的重新排列及替换 [打印本页]
作者: leo1984 时间: 2009-10-13 00:29 标题: 批处理对文本变量的重新排列及替换
請教各位前輩幫忙
小弟有一些文本的內容如下:
MY_THUMB.appendItem(1,'復仇之戰.part1.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg'); MY_THUMB.appendItem(2,'復仇之戰.part2.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435430.jpg'); MY_THUMB.appendItem(3,'復仇之戰.part3.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435609.jpg');
............................以此類推
我想要把所有文本紅色內容替換如下:
/Ref:abc /Rename:復仇之戰.part1.rar http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg
/Ref:abc /Rename:復仇之戰.part2.rar http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg
/Ref:abc /Rename:復仇之戰.part3.rar http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg
請問該如何辦到呢?
拜託幫忙,先說聲感謝!::yct20::
[ 本帖最后由 leo1984 于 2009-10-13 20:35 编辑 ]
作者: 随风 时间: 2009-10-13 01:48
请先仔细阅读版规,重新取个标题
作者: leo1984 时间: 2009-10-13 07:47
原帖由 随风 于 2009-10-13 01:48 发表
请先仔细阅读版规,重新取个标题
兩岸的用語不同
請問標題已改了,還可以嗎?@@
作者: 随风 时间: 2009-10-13 11:29
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=2,4 delims='" %%a in (a.txt) do (
- echo /Ref:abc /Rename:%%~na %%b
- ))>c.txt
- start c.txt
复制代码
作者: leo1984 时间: 2009-10-13 11:47
原帖由 随风 于 2009-10-13 11:29 发表
@echo off&setlocal enabledelayedexpansion
(for /f "tokens=2,4 delims='" %%a in (a.txt) do (
echo /Ref:abc /Rename:%%~na %%b
))>c.txt
start c.txt
感谢您的帮忙
但是我执行代码后,完全没反应,请问是什么原因呢
再谢
作者: 随风 时间: 2009-10-13 12:22
我测试没问题,
作者: leo1984 时间: 2009-10-13 16:51
原帖由 随风 于 2009-10-13 12:22 发表
我测试没问题,
版主,我刚才一再的测试
您给的代码存成bat,把我的文本存成a.txt,并且执行后转出的c.txt是空白的@@
我又试着将bat转换成exe一样无效
请问.......是我这边的问题吗@@?
[ 本帖最后由 leo1984 于 2009-10-13 17:17 编辑 ]
作者: leo1984 时间: 2009-10-13 17:32
抱歉抱歉~~可以執行,可能是我電腦方才出問題
可以請版主試試複制我的文本嗎
MY_THUMB.appendItem(1,'復仇之戰.part1.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg'); MY_THUMB.appendItem(2,'復仇之戰.part2.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435430.jpg'); MY_THUMB.appendItem(3,'復仇之戰.part3.rar.jpg','http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435609.jpg');
發現執行後,c.txt只有轉換出一列而已
/Ref:abc /Rename:復仇之戰.part1.rar http://1.photo.xuite.net/1/e/1/b/leo20010101010/3556063/t/135435310.jpg
作者: 随风 时间: 2009-10-13 17:52
你给的样本是一行吗?
我是把样本当作三行来处理的
作者: leo1984 时间: 2009-10-13 18:18
原帖由 随风 于 2009-10-13 17:52 发表
你给的样本是一行吗?
我是把样本当作三行来处理的
是的,我的样本是长长长....长的到不能再长的一行@@
但是我希望转换出来的是有分行的
请问要如何改呢
又再次感谢
[ 本帖最后由 leo1984 于 2009-10-13 18:21 编辑 ]
作者: Seter 时间: 2009-10-13 18:38
数据能否用code括起来?我们复制太麻烦了!
作者: 随风 时间: 2009-10-13 19:07
每一行都是一样的格式吗?都有三对()括弧?
方便的话,最好给部分样本来
作者: 随风 时间: 2009-10-13 19:36
:- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1-3 delims=)" %%a in (a.txt) do (
- for %%I in ("%%a" "%%b" "%%c") do (
- for /f "tokens=2,4 delims='" %%i in ("%%I") do (
- echo /Ref:abc /Rename:%%~ni %%j
- ))))>c.txt
- start c.txt
复制代码
作者: leo1984 时间: 2009-10-13 19:45
原帖由 随风 于 2009-10-13 19:36 发表
echo off&setlocal enabledelayedexpansion
(for /f "tokens=1-3 delims=)" %%a in (a.txt) do (
for %%I in ("%%a" "%%b" "%%c") do (
for /f "tokens=2,4 delims='" %%i in ("%%I") do (
...
版主大人
c.txt不光只有转换出三行而已
如果仅是三行内容,不需要批处理,我其实可以自己手动处理的@@
我原本要处理的文本内容远比这里的样本还多
我的意思是,可以设定无论多少文本内容都能处理吗?
谢谢^^
[ 本帖最后由 leo1984 于 2009-10-13 19:50 编辑 ]
作者: 随风 时间: 2009-10-13 19:51
你是说一行内容输出不确定多少行?
另:没必要大人大人的,在这里人人平等。。。
作者: Seter 时间: 2009-10-13 19:56
- @echo off&set/ps=<a.txt
- :g
- (for /f "tokens=1-4* delims='" %%a in ("%s%") do (if "%%b"=="" exit)&echo /Ref:abc /Rename:%%b %%d>>b.txt&set s=%%e)&goto g
复制代码
俺是随风大大的跟屁虫~
作者: leo1984 时间: 2009-10-13 19:58
原帖由 随风 于 2009-10-13 19:51 发表
你是说一行内容输出不确定多少行?
另:没必要大人大人的,在这里人人平等。。。
是的,就是这意思^^
不用过度解读我的语意,或者只是轻松的称谓@@
大概就像有人看到老朋友,称呼是大哥一样
我是单纯表达感谢和敬意,没有贬低或抬高谁的意涵
作者: 随风 时间: 2009-10-13 20:00
:- @echo off
- (for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"
- setlocal enabledelayedexpansion
- set "str=!str:)="!"
- set "str=!str:(="!"
- for %%I in (!str!) do (
- for /f "tokens=2,4 delims='" %%i in ("%%I") do (
- echo /Ref:abc /Rename:%%~i %%j
- )
- )
- endlocal
- ))>c.txt
- start c.txt
复制代码
作者: leo1984 时间: 2009-10-13 20:02
原帖由 Seter 于 2009-10-13 19:56 发表
@echo off&set/ps=>b.txt&set s=%%e)&goto g俺是随风大大的跟屁虫~
哇~~太感謝Seter
解決了~~還有版主也謝謝
我只能說~~~這世界上還是很多無私的好人的0.0
作者: leo1984 时间: 2009-10-13 20:37
原帖由 随风 于 2009-10-13 20:00 发表
echo off
(for /f "delims=" %%a in (a.txt) do (
set "str=%%a"
setlocal enabledelayedexpansion
set "str=!str="!"
set "str=!str="!"
for %%I in (!str!) do (
for /f "token ...
版主大人@@
請問一下處理幾行文本還可以
但是一旦處理多的話
c.txt輸出就會變成空白
我上傳樣本給您試試
感謝
作者: asnahu 时间: 2009-10-13 21:04 标题: 回复 20楼 的帖子
应该一开始就上传样本。如果都像你这样,帮你的人非得累死。
作者: leo1984 时间: 2009-10-13 21:14
原帖由 asnahu 于 2009-10-13 21:04 发表
应该一开始就上传样本。如果都像你这样,帮你的人非得累死。
我是擔心我的樣本文字太多,會讓大家看的眼花寮亂@@
所以先用幾行文字作樣本,看起來不會太吃力
抱歉喔
[ 本帖最后由 leo1984 于 2009-10-13 21:16 编辑 ]
作者: asnahu 时间: 2009-10-13 21:18 标题: 回复 22楼 的帖子
没必要跟我说抱歉,应该向斑竹道歉才是。
作者: Seter 时间: 2009-10-13 21:21
我的那个有限制的!
具体限制多少我忘记了[我记得是1024个字符,但是测试发现我的那小批处理居然可以承受1W+字节的文件]
所以...大大们加油!支持AN&随风!
作者: Batcher 时间: 2009-10-13 21:49 标题: 回复 20楼 的帖子
- sed "s/; /\n/g" a.txt | sed "s/.*[0-9],'\(.*part...\.rar\.jpg\)','\(.*\.jpg\)../\/Ref\:abc \/Rename\:\1 \2/g">b.txt
复制代码
第三方命令行工具 sed.exe 下载地址:
http://bbs.bathome.net/thread-1114-1-1.html
作者: leo1984 时间: 2009-10-13 22:01
原帖由 Batcher 于 2009-10-13 21:49 发表
sed "s/; /\n/g" a.txt | sed "s/.*[0-9],'\(.*part...\.rar\.jpg\)','\(.*\.jpg\)../\/Ref\:abc \/Rename\:\1 \2/g">b.txt第三方命令行工具 sed.exe 下载地址:
http://bbs.bathome.net/thread-1114-1-1.html
這裡最優秀的就是版主和管理員都大方的出來幫忙
真是太感人了... ... 我要哭了我...
問題解決了><
感謝各位幫忙
作者: leo1984 时间: 2009-10-13 22:17
可以顺便请教一下
文本内可以顺便处理一下
找到
-
- http://photo.xuite.net/_my/b_5');
复制代码
包括http://photo.xuite.net/_my/b_5'); 及前面的文字通通删去
再找到复制代码
包括</script><tr>及后面的文字通通删去吗?
这样可以方便处理
不了解的我一样上传样本
感谢
作者: asnahu 时间: 2009-10-14 08:52 标题: 回复 27楼 的帖子
不知是否编码问题,第二个文本始终得不到正确结果,VBS也歇菜了。以下代码针对第一个文本:- Dim objFSO,objRegEx
- Const ForReading = 1
- sFile = "a.txt"
-
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set oFile = objFSO.OpenTextFile(sFile, 1, TristateTrue)
- colLines = oFile.ReadAll
- oFile.Close
-
- Set objRegEx = CreateObject("VBScript.RegExp")
- objRegEx.Global = True
- objRegEx.IgnoreCase = True
- objRegEx.Pattern = "MY_THUMB.*jpg"
- Set Matches = objRegEx.Execute(colLines)
-
- For Each objMatch in Matches
- aryLines = aryLines & objMatch & vbCrLf
- Next
-
- aryLines = Split(aryLines, ";")
-
- For i = 0 To Ubound(aryLines) - 1
- var_1 = Replace(Replace(Split(aryLines(i), ",")(1),".jpg", ""),"'", "")
- var_2 = Replace(Replace(Split(aryLines(i), ",")(2),"'",""), ")", "")
- strLine = "/Ref:abc /Rename:" & var_1 & " " & var_2 & vbCrLf
- strLines = strLines & strLine & vbCrLf
- Next
-
- Wscript.Echo strLines
-
- Set objFSO = Nothing
- Set objRegEx = Nothing
复制代码
[ 本帖最后由 asnahu 于 2009-10-14 18:01 编辑 ]
作者: leo1984 时间: 2009-10-14 16:50
原帖由 asnahu 于 2009-10-14 08:52 发表
不知是否编码问题,第二个文本始终得不到正确结果,VBS也歇菜了。以下代码针对第一个文本:
Dim objFSO,objRegEx
Const ForReading = 1
sFile = "a.txt"
Dim objFSO,oFile,colLines
Set objFSO = CreateObj ...
非常謝謝你
現在的問題出在第二文本@@
不過也見識到這命令這麼多元的寫法
作者: asnahu 时间: 2009-10-14 18:44
还是正则来得快点,VBS:
- Dim objFSO, objFile, colLines
- Dim objRegEx, objMatches, objMatch, aryMatches
-
- Const ForReading = 1
- Const TristateTrue = -1
-
- sFile = "a.txt"
-
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set objFile = objFSO.OpenTextFile(sFile,1, false, -1)
- colLines = objFile.ReadAll
- objFile.Close
-
- Set objRegEx = CreateObject("VBScript.RegExp")
- objRegEx.Global = True
- objRegEx.IgnoreCase = True
- objRegEx.Pattern = "(復仇之戰\.[a-z]*[0-9]*\.[a-z]*\.[a-z]+)[^a-zA-z]*(\w+:\/\/\d\.\w+\.\w+\.\w+\/\d\/\d\/\w\/\d\/\w*\d*\/\d*\/\w\/\d*\.\w{3})"
- Set objMatches = objRegEx.Execute(colLines)
-
- For Each objMatch in objMatches
- objMatch = Replace(objMatch, ".jpg','", " ")
- objMatch = "/Ref:abc /Rename:" & objMatch
- aryMatches = aryMatches & objMatch & vbCrLf
- Next
-
- Wscript.Echo aryMatches
-
- Set objFSO = Nothing
- Set objRegEx = Nothing
复制代码
[ 本帖最后由 asnahu 于 2009-10-14 21:44 编辑 ]
作者: zqz0012005 时间: 2009-10-14 19:02 标题: 回复 29楼 的帖子
OpenTextFile 方法的语法是
OpenTextFile(filename[, iomode[, create[, format]]])
iomode 参数可以是下列设置中的任一种:
常数 | 值 | 描述 |
ForReading | 1 | 以只读方式打开文件。不能写这个文件。 |
ForWriting | 2 | 以写方式打开文件 |
ForAppending | 8 | 打开文件并从文件末尾开始写。 |
format 参数可以是下列设置中的任一种:
常数 | 值 | 描述 |
TristateTrue | -1 | 以 Unicode 格式打开文件。 |
TristateFalse | 0 | 以 ASCII 格式打开文件。 |
TristateUseDefault | -2 | 使用系统默认值打开文件。 |
LZ的文本是Unicode格式。
作者: asnahu 时间: 2009-10-14 19:21 标题: 回复 31楼 的帖子
不知何故,用unicode的方式打开读取文本2的内容只得到了一个问号,不解中...望斑竹测试一下。
作者: zqz0012005 时间: 2009-10-14 20:50
对27楼的文本,你确认是用Unicode 格式打开的吗?
fso.OpenTextFile("a.txt", 1, false, -1)
作者: asnahu 时间: 2009-10-14 21:45
谢谢斑竹,参数没用上,现在可以了。
作者: leo1984 时间: 2009-10-14 21:48
原帖由 asnahu 于 2009-10-14 18:44 发表
还是正则来得快点,VBS:
Dim objFSO, objFile, colLines
Dim objRegEx, objMatches, objMatch, aryMatches
Const ForReading = 1
Const TristateTrue = -1
sFile = "a.txt"
Set objFSO = CreateObj ...
大哥
"復仇之戰"這些字不能當成變量,那是不固定的@@
另外可以請您幫我處理完字串後輸出文本嗎,像是b.txt
謝謝
[ 本帖最后由 leo1984 于 2009-10-14 21:50 编辑 ]
作者: leo1984 时间: 2009-10-14 21:49
原帖由 zqz0012005 于 2009-10-14 20:50 发表
对27楼的文本,你确认是用Unicode 格式打开的吗?
fso.OpenTextFile("a.txt", 1, false, -1)
我傳的文本是big5繁體中文碼
我另傳一個utf-8的碼給您看看
作者: asnahu 时间: 2009-10-14 22:08
- Dim objFSO, objFile, colLines
- Dim objRegEx, objMatches, objMatch, aryMatches
-
- Const ForReading = 1
- Const TristateTrue = -1
-
- sFile = "a.txt"
-
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set objFile = objFSO.OpenTextFile(sFile,1, false, -1)
- colLines = objFile.ReadAll
- objFile.Close
-
- Set objRegEx = CreateObject("VBScript.RegExp")
- objRegEx.Global = True
- objRegEx.IgnoreCase = True
- objRegEx.Pattern = "(\D*\.[a-z]*[0-9]*\.[a-z]*\.[a-z]+)[^a-zA-z]*(\w+:\/\/\d\.\w+\.\w+\.\w+\/\d\/\d\/\w\/\d\/\w*\d*\/\d*\/\w\/\d*\.\w{3})"
- Set objMatches = objRegEx.Execute(colLines)
-
- For Each objMatch in objMatches
- objMatch = Replace(objMatch, ".jpg','", " ")
- objMatch = "/Ref:abc /Rename:" & objMatch
- aryMatches = aryMatches & objMatch & vbCrLf
- Next
-
- Set strFile = objFSO.CreateTextFile("b.txt", True)
- strFile.Write aryMatches
- strFile.Close
-
- Set objFSO = Nothing
- Set objRegEx = Nothing
复制代码
作者: leo1984 时间: 2009-10-15 00:56
原帖由 asnahu 于 2009-10-14 22:08 发表
Dim objFSO, objFile, colLines
Dim objRegEx, objMatches, objMatch, aryMatches
Const ForReading = 1
Const TristateTrue = -1
sFile = "a.txt"
Set objFSO = CreateObject("Scripting.FileSystemOb ...
大哥您有測試我的文本嗎@@
我測試結果是沒有輸出文本b.txt
所以我也不知道哪裡有問題
可以請您測試一下我的文本可否成功
感謝><
作者: 随风 时间: 2009-10-15 03:17
25楼用sed不是已经解决了吗,难道还不行?
作者: asnahu 时间: 2009-10-15 09:43 标题: 回复 38楼 的帖子
第一个是普通的ansi编码,第二是UTF-8 LITTLE ENDIAN编码,第三个是UTF-8 无 BOM 格式编码,用以下正则:
- (\D*\.[a-z]*[0-9]*\.[a-z]*\.[a-z]+)[^a-zA-z]*(\w*:\/\/[^/]*[^.]*\.\w{3})
复制代码
可以匹配第一个和第二个,不过第三个VBS打开是乱码。请你先测试。
作者: Batcher 时间: 2009-10-15 17:52 标题: 回复 39楼 的帖子
因为从27楼开始,需求又变了,囧ing
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |