有特殊字符批量获取字符串长度(batch get string length with specia

2019-10-19 08:27发布

我有一个包含两个文本列的文件。 使用批处理文件,我想提取文本的第二列,并获得字符串的长度,然后写入字符串的长度和字符串文本到输出文件。 ,挑战我的是确定哪些具有特殊字符的字符串长度的步骤。 例如,输入文件的样子:

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

任何帮助,将不胜感激。

Answer 1:

您可以使用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
)


Answer 2:

=导致问题,因为它没有报价,并批量解析器对待=作为标记分隔符。 当传递包含非引用字符串=作为参数,该字符串在每个破碎=成多个参数。 它应该是可以修复增加了一些战略上放置的报价你的代码,以及使用的~参数扩展修饰符根据需要去除封闭引号。 这不是一个通用的解决方案,但它应该在你的情况下工作,因为我不认为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


Answer 3:

要获得字符串的长度,我觉得下面的方法很有效。

@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%


Answer 4:

@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: =%"

在明显的一点应该是等价的。



文章来源: batch get string length with special characters