Board logo

标题: [文本处理] 批处理对文本变量的重新排列及替换 [打印本页]

作者: 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

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=2,4 delims='" %%a in (a.txt) do (
  3.    echo /Ref:abc /Rename:%%~na %%b
  4. ))>c.txt
  5. 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

:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1-3 delims=)" %%a in (a.txt) do (
  3.    for %%I in ("%%a" "%%b" "%%c") do (
  4.       for /f "tokens=2,4 delims='" %%i in ("%%I") do (
  5.          echo /Ref:abc /Rename:%%~ni %%j
  6. ))))>c.txt
  7. 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

  1. @echo off&set/ps=<a.txt
  2. :g
  3. (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

:
  1. @echo off
  2. (for /f "delims=" %%a in (a.txt) do (
  3.    set "str=%%a"
  4.    setlocal enabledelayedexpansion
  5.    set "str=!str:)="!"
  6.    set "str=!str:(="!"
  7.    for %%I in (!str!) do (
  8.       for /f "tokens=2,4 delims='" %%i in ("%%I") do (
  9.          echo /Ref:abc /Rename:%%~i %%j
  10.       )
  11.    )
  12.    endlocal
  13. ))>c.txt
  14. 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楼 的帖子

  1. 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

可以顺便请教一下
文本内可以顺便处理一下
找到

  1. http://photo.xuite.net/_my/b_5');
复制代码


包括http://photo.xuite.net/_my/b_5'); 及前面的文字通通删去

再找到
  1. </script><tr>
复制代码


包括</script><tr>及后面的文字通通删去吗?
这样可以方便处理
不了解的我一样上传样本
感谢
作者: asnahu    时间: 2009-10-14 08:52     标题: 回复 27楼 的帖子

不知是否编码问题,第二个文本始终得不到正确结果,VBS也歇菜了。以下代码针对第一个文本:
  1. Dim objFSO,objRegEx
  2. Const ForReading = 1
  3. sFile = "a.txt"
  4. Set objFSO = CreateObject("Scripting.FileSystemObject")
  5. Set oFile = objFSO.OpenTextFile(sFile,  1, TristateTrue)
  6. colLines = oFile.ReadAll
  7. oFile.Close
  8. Set objRegEx = CreateObject("VBScript.RegExp")
  9. objRegEx.Global = True
  10. objRegEx.IgnoreCase = True
  11. objRegEx.Pattern = "MY_THUMB.*jpg"
  12. Set Matches = objRegEx.Execute(colLines)
  13. For Each objMatch in Matches
  14.      aryLines = aryLines & objMatch & vbCrLf
  15. Next
  16. aryLines = Split(aryLines, ";")
  17. For i = 0 To Ubound(aryLines) - 1
  18.     var_1 = Replace(Replace(Split(aryLines(i), ",")(1),".jpg", ""),"'", "")
  19.     var_2 = Replace(Replace(Split(aryLines(i), ",")(2),"'",""), ")", "")
  20.     strLine = "/Ref:abc /Rename:" & var_1 & " " & var_2 & vbCrLf
  21.     strLines = strLines & strLine & vbCrLf
  22. Next
  23. Wscript.Echo strLines
  24. Set objFSO   = Nothing
  25. 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:

  1. Dim objFSO, objFile, colLines
  2. Dim objRegEx, objMatches, objMatch, aryMatches
  3. Const ForReading   = 1
  4. Const TristateTrue = -1
  5. sFile = "a.txt"
  6. Set objFSO = CreateObject("Scripting.FileSystemObject")
  7. Set objFile = objFSO.OpenTextFile(sFile,1, false, -1)
  8. colLines = objFile.ReadAll
  9. objFile.Close
  10. Set objRegEx = CreateObject("VBScript.RegExp")
  11. objRegEx.Global = True
  12. objRegEx.IgnoreCase = True
  13. 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})"
  14. Set objMatches = objRegEx.Execute(colLines)
  15. For Each objMatch in objMatches
  16.         objMatch = Replace(objMatch, ".jpg','", " ")
  17.         objMatch = "/Ref:abc /Rename:" & objMatch
  18.         aryMatches = aryMatches & objMatch & vbCrLf
  19. Next
  20. Wscript.Echo aryMatches
  21. Set objFSO   = Nothing
  22. Set objRegEx = Nothing
复制代码



[ 本帖最后由 asnahu 于 2009-10-14 21:44 编辑 ]
作者: zqz0012005    时间: 2009-10-14 19:02     标题: 回复 29楼 的帖子

OpenTextFile 方法的语法是
OpenTextFile(filename[, iomode[, create[, format]]])

iomode 参数可以是下列设置中的任一种:

常数描述
ForReading1以只读方式打开文件。不能写这个文件。
ForWriting2以写方式打开文件
ForAppending8打开文件并从文件末尾开始写。

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

  1. Dim objFSO, objFile, colLines
  2. Dim objRegEx, objMatches, objMatch, aryMatches
  3. Const ForReading   = 1
  4. Const TristateTrue = -1
  5. sFile = "a.txt"
  6. Set objFSO = CreateObject("Scripting.FileSystemObject")
  7. Set objFile = objFSO.OpenTextFile(sFile,1, false, -1)
  8. colLines = objFile.ReadAll
  9. objFile.Close
  10. Set objRegEx = CreateObject("VBScript.RegExp")
  11. objRegEx.Global = True
  12. objRegEx.IgnoreCase = True
  13. 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})"
  14. Set objMatches = objRegEx.Execute(colLines)
  15. For Each objMatch in objMatches
  16.         objMatch = Replace(objMatch, ".jpg','", " ")
  17.         objMatch = "/Ref:abc /Rename:" & objMatch
  18.         aryMatches = aryMatches & objMatch & vbCrLf
  19. Next
  20. Set strFile = objFSO.CreateTextFile("b.txt", True)
  21. strFile.Write aryMatches
  22. strFile.Close
  23. Set objFSO   = Nothing
  24. 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 格式编码,用以下正则:

  1. (\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://www.bathome.net/) Powered by Discuz! 7.2