返回列表 发帖
本帖最后由 yakeyun 于 2022-5-20 14:07 编辑

回复 1# 13545876873

贴主要表达的意思:
D盘存在如下两个目录:
D:\基因合成\2022.5
                              \5001\
                              \5002\
                              \5003\
D:\测序结果
                  \[K3746-5001-1-26-PUC57]M13-48_B03.ab1
                  \[K3746-5001-25-48-PUC57]M13-48_B03.ab1
                  \[T4567-5003-25-48-PUC57]M13-47_C03.ab1
                  \[V2001-5002-25-48-PUC57]M13-47_C03.ab1

需求读取D:\测序结果目录中的文件,根据5001、5002、5003字段分类文件,然后移动到D:\基因合成\2022.5\目录下对应字段文件夹中。

另存为ANSI格式,不然中文目录不会被识别。
@echo off&setlocal enabledelayedexpansion
for /f %%a in ('dir /a /s /b "D:\测序结果\*.ab1"') do (
set dvn=%%a
for /f "tokens=2 delims=[]" %%b in ("!dvn!") do (
for /f "tokens=2 delims=-" %%c in ("%%b") do (
set mls=%%c
set Ns=%date:~0,4%
set Ys=%date:~5,2%
if !Ys!==01 (set "Ys=!Ys:01=1!")
if !Ys!==02 (set "Ys=!Ys:02=2!")
if !Ys!==03 (set "Ys=!Ys:03=3!")
if !Ys!==04 (set "Ys=!Ys:04=4!")
if !Ys!==05 (set "Ys=!Ys:05=5!")
if !Ys!==06 (set "Ys=!Ys:06=6!")
if !Ys!==07 (set "Ys=!Ys:07=7!")
if !Ys!==08 (set "Ys=!Ys:08=8!")
if !Ys!==09 (set "Ys=!Ys:09=9!")
set "today=!Ns!.!Ys!"
if exist D:\基因合成\!today!\!mls! (move /y "!dvn!" "D:\基因合成\!today!\!mls!" >nul) else (
md "D:\基因合成\!today!"
md "D:\基因合成\!today!\!mls!"
move /y "!dvn!" "D:\基因合成\!today!\!mls!" >nul
)
)
)
)
exitCOPY
1

评分人数

TOP

回复 15# 13545876873


条件本身就冲突,没办法操作。5001存在2个文档,取值会出错。

TOP

回复 22# 13545876873

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

评分人数

TOP

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

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

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



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

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

评分人数

TOP

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

回复 30# 13545876873

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


1

评分人数

TOP

返回列表