[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

200元求助批处理从txt文件截取到网址信息并判断

费用200元(还可追加),1-2天内完成,
请查看我列出的信息,如果能处理的话,可以在帖子留言,我会回复微信

目录结构如图:
需要处理的是,当前路径下的所有文件夹(实际工作中可能文件名不同,数量也不一致)中的所有txt文件中的所有txt内容




一小部分数据
链接:https://pan.baidu.com/s/1oQnnTWvq07Gl-Qe4ULKvLg
提取码:uoav

问题描述:
采集的一些文章导出为txt文件后,存在一些网址信息,在前期处理中不好被处理,导致了现在的问题。


文件中的网址格式不一,这里复制一小部分文件中含有的内容
  1. 好运的好名字:http://www.123.com/qiming/</p><h3>人力资源公司名称
  2. 课程试听【复制后面链接在浏览器也可打开】:       www.ab.com.cn/school/3dmodel?type=4&amp;zdhhr-11y04r-1991147216662704187   </p><p>在“3d打
  3. 百能网(www.ae.cn</p><p>)是一家专注
  4. 异议或投诉,请联系:info@aa.cn</p><p>金江
  5. 不过当时 www.n1.com已被人注册
  6. 口气注册了www.126.com、www.188.com等一批短数
  7. 可打开】:       www.h1.com.cn/school/3dmodel?type=2&amp;zdhhr-10y22r-28436431   </p><p>在“3
复制代码
解决方案:
定位到文中的 .com   .cn     .cc   .net   .org  .top   .vip  字符位置
然后向左截取至第一个不是英文且不是英文标点的位置
向右截取至   “</”  或者第一个不是英文且不是英文标点的位置(哪个先满足条件,就以哪个为准作为结束条件)
//我只是这样想的,可能描述上不不流畅
如果有其他剔除方式也可

处理流程:
截取到网址信息后,判断该网址长度,如果大于6个字符(就是仅有.com  .cn等本身的话不需要处理),则将其移除掉,并将移除掉的内容写入到当前路径下的  info.txt日志中(为了查看是否有截取错误等情况)


其他:单次处理一般数据量在10-60万个txt,速度上尽可能的快
每日一问

本帖最后由 jyswjjgdwtdtj 于 2023-6-12 20:14 编辑

要不你干脆直接把你采集的网址发过来直接采集?

如果这里有一个字符串
aaa.bb.comasdf</
你是要截取aaa.bb.com还是aaa.bb.comasdf?

TOP

本帖最后由 jyswjjgdwtdtj 于 2023-6-12 21:12 编辑

要是效率不够还能再提(但是也没太大作用)
  1. set s=createobject("shell.application")
  2. set f=s.namespace(replace(wscript.scriptfullname,wscript.scriptname,""))
  3. set re=new regexp
  4. set fso=createobject("scripting.filesystemobject")
  5. set info=fso.createtextfile("info.log",2,true)
  6. function gettext(fp)
  7. set a=fso.opentextfile(fp,1)
  8. gettext=a.readall
  9. a.close()
  10. end function
  11. sub writetext(fp,t)
  12. on error resume next
  13. set a=fso.createtextfile(fp,true)
  14. if err.number<>0 then msgbox fp:err.clear
  15. a.write t
  16. a.close()
  17. end sub
  18. re.pattern="[a-zA-Z\.\\]+\.(com|cn|cc|net|org|top|vip)[a-zA-Z\.\\]*"
  19. re.global=true
  20. call ft(f)
  21. sub ft(obj)
  22. set fs=obj.items
  23. fs.filter &h20,"*"
  24. set fi=obj.items
  25. fi.filter &h40,"*.txt"
  26. for each f in fs
  27. call ft(f.getfolder)
  28. next
  29. for each f in fi
  30. t=gettext(f.path)
  31.   for each e in re.execute(t)
  32.     if len(e)<6 then
  33.        t=replace(t,e,"")
  34.        info.writeline e
  35.     end if
  36.   next
  37. call writetext(f.path,t)
  38. next
  39. end sub
复制代码
保存为vbs 建议备份文件在运行
嗯……还是ps代码漂亮 可惜我不会

TOP

  1. <# :
  2. cls&echo off&cd /d "%~dp0"&mode con lines=5000
  3. path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
  4. set "current=%cd%"
  5. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
  6. pause
  7. exit
  8. #>
  9. $current=($env:current).trimend('\');
  10. $logfile=$current+'\info.txt';
  11. $enc=New-Object System.Text.UTF8Encoding $False;
  12. $fs=New-Object System.IO.FileStream($logfile, [System.IO.FileMode]::Create);
  13. $sw=New-Object System.IO.StreamWriter($fs, $enc);
  14. $reg='[\x21-\x27\x2a-\x3b\x3f-\x7e\x3d]+(\.com|\.cn|\.cc|\.net|\.org|\.top|\.vip)[\x21-\x27\x2a-\x3b\x3f-\x7e\x3d]*';
  15. $folders=@(dir -literal $current|?{$_ -is [System.IO.DirectoryInfo]});
  16. for($i=0;$i -lt $folders.length;$i++){
  17.     write-host $folders[$i].Name;
  18.     $files=@(dir -literal $folders[$i].FullName|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
  19.     for($j=0;$j -lt $files.length;$j++){
  20.         $filepath=$files[$j].FullName.Substring($current.length);
  21.         $arr=New-Object -TypeName System.Collections.ArrayList;
  22.         $text=[IO.File]::ReadAllText($files[$j].FullName, $enc);
  23.         $text=[regex]::replace($text, $reg, {
  24.             param($m);
  25.             $it=$m.groups[0].value;
  26.             if($it.length -gt 6){
  27.                 [void]$arr.add($it);
  28.                 return '';
  29.             }else{return $it;}
  30.         });
  31.         if($arr.count -gt 0){
  32.             [IO.File]::WriteAllText($files[$j].FullName, $text, $enc);
  33.             $line=$filepath+"`r`n"+($arr -join "`r`n");
  34.             $sw.WriteLine($line);
  35.             $sw.WriteLine('');
  36.             $sw.Flush();
  37.         }
  38.     }
  39. }
  40. $sw.Close();
  41. $fs.Close();
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 4# zaqmlp


    感谢老哥,暂时尚未发现问题,200已经扫描头像转过去了,如果需要修改到时候我就再追加回复
每日一问

TOP

回复 3# jyswjjgdwtdtj


    首先说声谢谢
执行后原始文件乱码,暂未看到效果,我使用了另外一个老哥的方案了
每日一问

TOP

回复 4# zaqmlp


    老哥,如果能有一个处理进度条就好了
每日一问

TOP

本帖最后由 jyswjjgdwtdtj 于 2023-6-13 19:50 编辑

嗯 改了一下就好了
  1. set s=createobject("shell.application")
  2. set f=s.namespace(createobject("wscript.shell").currentdirectory)
  3. set re=new regexp
  4. set fso=createobject("scripting.filesystemobject")
  5. set info=fso.createtextfile("info.log",2,true)
  6. function gettext(fp)
  7.     Set objStream = CreateObject("ADODB.Stream")
  8.     objStream.CharSet = "utf-8"
  9.     objStream.Open
  10.     objStream.LoadFromFile fp
  11.    gettext=objstream.readtext
  12. end function
  13. sub writetext(fp,t)
  14.     Set objStream = CreateObject("ADODB.Stream")
  15.     objStream.CharSet = "utf-8"
  16.     objStream.Open
  17. objstream.writetext t
  18.     objStream.savetoFile fp,2
  19. end sub
  20. re.pattern="[a-zA-Z\.\\]+\.(com|cn|cc|net|org|top|vip)[a-zA-Z\.\\]*"
  21. re.global=true
  22. call ft(f)
  23. sub ft(obj)
  24. set fs=obj.items
  25. fs.filter &h20,"*"
  26. set fi=obj.items
  27. fi.filter &h40,"*.txt"
  28. for each f in fs
  29. call ft(f.getfolder)
  30. next
  31. for each f in fi
  32. t=gettext(f.path)
  33. msgbox t
  34.   for each e in re.execute(t)
  35.     if len(e)<6 then
  36.        t=replace(t,e,"")
  37.        info.writeline e
  38.     end if
  39.   next
  40. call writetext(f.path,t)
  41. next
  42. end sub
复制代码

TOP

返回列表