我有一个包含两个文本列的文件。 使用批处理文件,我想提取文本的第二列,并获得字符串的长度,然后写入字符串的长度和字符串文本到输出文件。 ,挑战我的是确定哪些具有特殊字符的字符串长度的步骤。 例如,输入文件的样子:
escitalopram CN(C)CCC[C@@]1(C2=C(CO1)C=C(C=C2)C#N)C3=CC=C(C=C3)F
ibuprofen CC(C)CC1=CC=C(C=C1)C(C)C(=O)O
keflex CC1=C(N2[C@@H]([C@@H](C2=O)NC(=O)[C@@H](C3=CC=CC=C3)N)SC1)C(=O)O
aspirin CC(=O)OC1=CC=CC=C1C(=O)O
linoleic_acid CCCCC/C=C\C/C=C\CCCCCCCC(=O)O
我可以读取该文件中提取使用批处理命令行和参%1中的两个标记。 我已经尝试了一些我在小组讨论中发现的子程序,但我不能让他们的工作。 在“=”号,也许是其他特殊字符会导致问题。 我寻找能产生这样一个输出文件的解决方案。 忽略了 “@”, “/” 和 “\” 的迹象:
escitalopram 49
ibuprofen 29
keflex 58
aspirin 24
linoleic_acid 25
我的计划迄今为止是这样的:
@echo off
setLocal EnableDelayedExpansion enableextensions
set arg1=%1
FOR /F "tokens=1,2 delims= " %%r IN (%1) DO (
set teststring="%%s"
echo "Passing " %%s
call :GetStrLength %%s
echo.%%s
goto :EOF
)
::========================
:GetStrLength
setlocal enableextensions
set s=%1
echo " counting.... " %1
:: Get the length of the quoted string assuming a max of 255
set charCount=0
for /l %%c in (0,1,255) do (
set si=!s:~%%c!
if defined si set /a charCount+=1)
if %charCount% EQU 256 set charCount=0
echo The length of "%s%" is %charCount% characters
endlocal & goto :EOF
任何帮助,将不胜感激。
您可以使用strlen函数,但你应该使用BYVAL参数的牛栏。
该功能可以处理任何字符串,它总是需要13环,以确定长度。
作为批变量可以包含不超过8191个字符,这是不够的。
echo off
set "myString=Any content"
call :strlen result myString
echo %result%
exit /b
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
该=
导致问题,因为它没有报价,并批量解析器对待=
作为标记分隔符。 当传递包含非引用字符串=
作为参数,该字符串在每个破碎=
成多个参数。 它应该是可以修复增加了一些战略上放置的报价你的代码,以及使用的~
参数扩展修饰符根据需要去除封闭引号。 这不是一个通用的解决方案,但它应该在你的情况下工作,因为我不认为SMILES串过包含"
字符。请注意,包含引号引用字符串将包含被有效地没有报价字符串的某些部分。
这里是你的代码固定。 我已经删除了一些不必要的代码和一些诊断信息。
@echo off
setlocal
FOR /F "tokens=1,2 delims= " %%r IN (%1) DO (
echo Passing "%%s"
call :GetStrLength "%%s"
goto :EOF
)
::========================
:GetStrLength
setlocal enableDelayedExpansion
set "s=%~1"
echo counting.... %1
:: Get the length of the quoted string assuming a max of 255
set charCount=0
for /l %%c in (0,1,255) do (
set si=!s:~%%c!
if defined si set /a charCount+=1
)
if %charCount% EQU 256 set charCount=0
echo The length of "%s%" is %charCount% characters
endlocal & goto :EOF
下面是一个在去除立体化学字符后,计算每个SMILES字符串的长度完全工作脚本。 (我很好奇,为什么你想要的值)。 它采用了非常快的strlen函数的杰布的回答正确的版本。 我加入了有usebackq选项将INTIAL FOR / F循环,以防万一用户通过包含空格的引用文件名。
@echo off
setlocal enableDelayedExpansion
for /f "usebackq tokens=1,2 delims= " %%A IN (%1) do (
set "SMILES=%%B"
for %%C in (@ / \) do set "SMILES=!SMILES:%%C=!"
call :strlen len SMILES
echo %%A !len!
)
exit /b
:strlen <resultVar> <stringVar>
setlocal enableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
endlocal&set "%~1=%len%"
exit /b
要获得字符串的长度,我觉得下面的方法很有效。
@echo off
setLocal EnableDelayedExpansion
set s=%*
set length=0
:count
if defined s (
if "!s:~0,1!" NEQ "@" if "!s:~0,1!" NEQ "/" if "!s:~0,1!" NEQ "\" set /A length += 1
set "s=%s:~1%"
goto count
)
echo %length%
@ECHO OFF
SETLOCAL
FOR /f "tokens=1*delims= " %%a IN (q21817684.txt) DO (
SET /a count=0
SET "chemical=%%a"
SET "formula=%%b"
CALL :report
)
GOTO :EOF
:report
SET "formula=%formula:@=%"
SET "formula=%formula:\=%"
SET "formula=%formula:/=%"
:reportl
IF DEFINED formula (
SET "formula=%formula:~1%"
SET /a count +=1
GOTO reportl
)
ECHO %chemical% %count%
GOTO :eof
我用了一个名为q21817684.txt
我的测试。 侑数据具有公式对头抱菌素IV和阿司匹林后尾随空格。 我消除了我的测试,但加入
SET "formula=%formula: =%"
在明显的一点应该是等价的。