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


大哥  
你这个可以把ab1文件,从测序结果文件夹里,剪切到相应文件夹;
                                也能在相应文件夹里生成相应的txt文档,但就是有一个小小的问题,我用图片说明一下哈

   
    比如:     5001-25-52这个文本里显示的字母完全是我想要(第52个也就是到了最后一个字母)
                 
但               5001-1-14文本里的字母      不是到5001-14的最后一个字母,它少了17个字母
                   5001-1-26文本里的字母       不是到5001-26的最后一个字母,它少了17个字母
                   5001-25-38文本里的字母      不是到5001-38的最后一个字母,它少了17个字母
只有要选取到最后的(5001-52)字母,才会完全正确,,,但如果选取到中间就结束,就会少17个字母啊:'(

TOP

问你6楼代码测试结果就是为了继续下一步,你也不说一声。假设6楼代码没有问题,试试下面代码是否可行。未测试,效率可能不高:
  1. @echo off
  2. cd /d "D:\基因合成\2022.5\"
  3. for /d %%i in (*) do (
  4.   move "D:\测序结果\*-%%i-*.ab1" "%%i\"
  5. )
  6. for /d %%i in (*) do (
  7.   pushd "%%i"
  8.   for /f "tokens=2-4 delims=-" %%a in ('dir /b /a-d *.ab1') do (
  9.     set n=0
  10.     setlocal enabledelayedexpansion
  11.     for /f "delims=" %%j in ('findstr ">" %%a.htm') do (
  12.       set "str1=%%j"
  13.       set "str1=!str1:*span =<span !"
  14.       set "str1=!str1:</td></tr>=! span"
  15.       set "str1=!str1:<= !"
  16.       set "str1=!str1:>= !"
  17.       set "str1=!str1:/=!"
  18.       for %%k in (!str1!) do (
  19.         if "%%k"=="span" (
  20.           if !n! geq %%b if !n! leq %%c set str2=!str2!!var!
  21.           set /a n+=1
  22.         )
  23.         set "var=%%k"
  24.       )
  25.     )
  26.     echo,!str2!>%%a-%%b-%%c.txt
  27.     endlocal
  28.   )
  29.   popd
  30. )
  31. pause
复制代码
1

评分人数

TOP

回复 28# qixiaobin0715


大哥    用了xczxczxcz  和31楼大哥的方法,可以在每个子文件夹里,在MyScript.ps1  文档里修改  ,然后用MyScript.bat  自动生成了哈

我在想能不能在搞一个bat,不用修改MyScript.ps1  文档,也可以批量处理多个子文件夹啊

TOP

回复 31# yakeyun


大哥这个运行得没问题哈

TOP

回复 27# xczxczxcz

大哥用你和 31楼大哥的方法,我在其他的文件夹里也试过了,运行没有问题

      能不能在文件夹(2022)外面搞一个bat,这个bat可以把这个文件夹(2022)  里的所有子文件夹(5001,5002,5003,5004等等),
      按照文件夹里的ab1文件上的区间,把所有文件夹都生成相信的txt文档啊

TOP

本帖最后由 yakeyun 于 2022-5-23 21:40 编辑

回复 30# 13545876873

把27楼代码保存为MyScript.ps1:
  1. $html = gc '.\5001.htm' -Raw -Encoding UTF8;
  2. $oligos_arr=[regex]::Matches($html, '(?i)(?<=<tr><td>oligos.*?style.*?>)[^<]+').value.Foreach{
  3. ($_.Trim('|') -replace '&nbsp;|[@\(+\)]' -split '\|').Foreach{
  4. $e=$_.split(':');
  5. @{ID=$e[0].Trim('-'); begin=[int]$e[1]; end=[int]$e[2]; }
  6. }
  7. }
  8. $_5gt3=[regex]::Match($html, "(?<=5'--&gt;3'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
  9. #$_3lt5=[regex]::Match($html, "(?<=3'&lt;--5'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
  10. <# 5000-1-14 ... #>
  11. ('5001-1-14','5001-1-26','5001-25-38','5001-25-52').ForEach{
  12. $arr=$_.split('-');
  13. $index1=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[1]);
  14. $index2=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[2]);
  15. if($index1 -ne -1 -and $index2 -ne -1){
  16. [int]$t1=$oligos_arr[$index1].begin - 1;
  17. [int]$t2=$oligos_arr[$index2].end - 1;
  18. sc ".\$_.txt" -Value (-join($_5gt3[$t1..$t2])) -Force -Verbose -NoNewline;
  19. }
  20. }
  21. [Console]::Write("全部完成!");
复制代码
同目录下放一个MyScript.bat:
  1. @echo off
  2. PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1'"
  3. exit
复制代码
直接执行MyScript.bat即可实现自动提取数据,虽然不懂Powershell功能,但是感觉比批处理还是要功能更强大一些。


1

评分人数

TOP

回复 27# xczxczxcz


大哥,你这个要保存什么,的自己修改,那我有很多文件夹:5002,5003。。。。5100       那和直接在htm上复制粘贴没啥区别了呀 :'(

TOP

回复 25# yakeyun
大哥,你的意思是这样的吧
但这不是我想要的呀
你这个方法最后把<tr><td>5'--&gt;3'</td><td style="color:silver">这些字符删除后,文本里就是5001的全部的2138个字母;然后我再去手动查找截取,,,那也可以直接再htm文件里复制粘贴到txt里了啊:'(
                      <span style="color:red;">
                      </span>
                     </td></tr>

我想要的是能不能:我测序结果文件夹里有很多ab1文件:[K3746-5001-1-26-PUC57]M13-48_B03 ;  [K3746-5001-25-48-PUC57]M13-48_B03;
                                                                         [T4567-5003-25-48-PUC57]M13-47_C03 ;     [V2001-5002-25-48-PUC57]M13-47_C03 等等
                                                                     第一步: 在我用一个bat把这些ab1文件剪切到相应的基因合成文件夹5001,5001,5003,5002等等里后,每个文件夹里已经有一个相应的htm文件:5001.htm,5001.htm,5003.htm,5002.htm等等
   第二步:在这些ab1文件被剪切进去后,相应的文件夹根据下面图片红框框处,自动生成一个txt文档(并把这两个数字之间的字母复制进去)[url=https://imgtu.com/i/XpY3bd][/url

:'( :'( :'(

TOP

回复 22# 13545876873
你先看一下6楼代码能完成先前的需求吗?

TOP

给你一个WIN10的吧,至少PS>4.0
要保存哪些文件自行按格式修改, 脚本保存为 xxx.ps1
  1. $html = gc '.\5001.htm' -Raw -Encoding UTF8;
  2. $oligos_arr=[regex]::Matches($html, '(?i)(?<=<tr><td>oligos.*?style.*?>)[^<]+').value.Foreach{
  3. ($_.Trim('|') -replace '&nbsp;|[@\(+\)]' -split '\|').Foreach{
  4. $e=$_.split(':');
  5. @{ID=$e[0].Trim('-'); begin=[int]$e[1]; end=[int]$e[2]; }
  6. }
  7. }
  8. $_5gt3=[regex]::Match($html, "(?<=5'--&gt;3'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
  9. #$_3lt5=[regex]::Match($html, "(?<=3'&lt;--5'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
  10. <# 5000-1-14 ... #>
  11. ('5001-1-14','5001-1-26','5001-25-38','5001-25-52').ForEach{
  12. $arr=$_.split('-');
  13. $index1=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[1]);
  14. $index2=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[2]);
  15. if($index1 -ne -1 -and $index2 -ne -1){
  16. [int]$t1=$oligos_arr[$index1].begin - 1;
  17. [int]$t2=$oligos_arr[$index2].end - 1;
  18. sc ".\$_.log" -Value (-join($_5gt3[$t1..$t2])) -Force -Verbose -NoNewline;
  19. }
  20. }
  21. [Console]::Write("全部完成 按任意键退出");
  22. [void][Console]::ReadKey();
复制代码
1

评分人数

QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 25# yakeyun

大哥,htm的规律是这样的哈:  

TOP

本帖最后由 yakeyun 于 2022-5-22 23:26 编辑

回复 24# 13545876873
你这个获取的结果已经很明显了,说明html文件并不是TXT文件里面的行内容,需要你自己找一下规律,然后根据规律来截取。
比如第十行有数据,那么第十行的第几个到第几个是固定字符,或者字符被特殊字符夹在中间等。只有有规律的文本才能被批处理。

比如我帮你找出来的规律,你的5001.txt序列文件,可以用我上面发的代码获取到,不过代码要改成下面这个。
从取值可以看到,所有类容都是一行显示,为了发现规律,我故意将前面“><span”后面的字符分行。那么剩下的规律就是将取值进行赋值,
比如获取到的“5001-11-24.txt”文本,除了文件头和文件尾没有规律,中间部分全部都是规律字符,只需要将结果做4次替换,就可以取到正确结果。
  1. @echo off&setlocal enabledelayedexpansion
  2. set txts=5001-11-24
  3. for /f %%d in ('dir /a /s /b ".\*.htm"') do (
  4. for /f "skip=9 tokens=*" %%e in (%%d) do (
  5. set op=%%e
  6. set /a m+=1
  7. if !m! LEQ 1 (
  8. echo !op!
  9. )
  10. )
  11. ) >.\!txts!.txt
复制代码



通过替换法测试发现,提取后的文本,只需要再次替换下面4处文本即可:

<tr><td>5'--&gt;3'</td><td style="color:silver">
<span style="color:red;">
</span>
</td></tr>
1

评分人数

TOP

大哥   回复 23# yakeyun
你的这个5001-11-24我运行出来是这样的
不是我想要的结果哈
比如5001-11-24,我想要的是5001-11(397:451)的首(第397个字母),
                                     到5001-24(934:988)的尾(第988个字母),之间的所有字母(文档里只要这些字母,其他的字母符号都不要)

这个是根据从测序结果文件夹里,剪切到基因合成文件夹里的ab1格式文件,的名字来选的哈(红框框处)

我想要所有从测序结果文件夹里,剪切到基因合成文件夹里的ab1格式文件,都会根据名字上的红框框处,自动生成一个txt文档(并把这两个数字之间的字母复制进去)

TOP

回复 22# 13545876873

代码备份留存,如果单纯的只需要提取11~24行信息,可以用下面的代码,但是你的文件没有规律,且文件用记事本打开一行的内容太长了,最主要的是要你自己明白这个文件和其它文件是否有规律,比如字符位置是否固定等等。
  1. @echo off&setlocal enabledelayedexpansion
  2. set today=2022.5
  3. set mls=5001
  4. set txts=5001-11-24
  5. for /f %%d in ('dir /a /s /b "D:\基因合成\!today!\!mls!\*.htm"') do (
  6. for /f "skip=10 tokens=*" %%e in (%%d) do (
  7. set op=%%e
  8. set /a m+=1
  9. if !m! LEQ 14 (
  10. echo !op!
  11. )
  12. )
  13. ) >D:\基因合成\!today!\!mls!\!txts!.txt
  14. (
  15. for /f %%i in ('type D:\基因合成\!today!\!mls!\!txts!.txt') do (
  16. echo %%i
  17. )
  18. )>D:\基因合成\!today!\!mls!\!mls!.txt
  19. exit
复制代码
1

评分人数

TOP

回复 26# qixiaobin0715


比如
5001-1-14就是第一行:第1个字母到 第572个的全部 字母;       在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-1-14的文本,并把这段字母复制进去
5001-1-26就是第一行:第1个字母到 第1064个的全部 字母;     在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-1-26的文本,并把这段字母复制进去
5001-25-38就是第一行:第972个字母到 第1550个的全部 字母;      在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-25-38的文本,并把这段字母复制进去
5001-25-52就是第一行:第972个字母到 第2138个的全部 字母          在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-25-52的文本,并把这段字母复制进去
5001就是第一行:第1个字母到 第2138个的全部 字母   ;                         最后同时新建一个5001的文本,把第一行全部字母复制进去

TOP

返回列表