Batch file 在字符串中使用数字

Batch file 在字符串中使用数字,batch-file,file-io,sum,Batch File,File Io,Sum,这是对使用批处理文件的解决方案的请求。我有一个包含两列的文件—名称字符串和数据字符串。数据字符串包含字母和数字。我想提取这些数字并求和。例如,数据字符串可以是C18H26ClN3O。正确的总和是49 18+26+1+3+1。这是一种化学物质的分子式,因此请注意,Cl代表单个元素和一个隐含值,在本例中为1。还有其他可能的两个字母组合,但没有三个字母组合。末尾的O也有一个隐含值1。我不是程序员,但我怀疑有比使用批处理文件更容易解决这个问题的方法。但是,我需要在批处理文件中执行此操作。输入数据文件如下

这是对使用批处理文件的解决方案的请求。我有一个包含两列的文件—名称字符串和数据字符串。数据字符串包含字母和数字。我想提取这些数字并求和。例如,数据字符串可以是C18H26ClN3O。正确的总和是49 18+26+1+3+1。这是一种化学物质的分子式,因此请注意,Cl代表单个元素和一个隐含值,在本例中为1。还有其他可能的两个字母组合,但没有三个字母组合。末尾的O也有一个隐含值1。我不是程序员,但我怀疑有比使用批处理文件更容易解决这个问题的方法。但是,我需要在批处理文件中执行此操作。输入数据文件如下所示:

hydroxychloroquine C18H26ClN3O  
ibuprofen C13H18O2  
crestor C44H54CaF2N6O12S2  
aspirin C9H8O4  
hydroxychloroquine 49
ibuprofen 33
crestor 121
aspirin 21
每条记录一行,回车

输出文件如下所示:

hydroxychloroquine C18H26ClN3O  
ibuprofen C13H18O2  
crestor C44H54CaF2N6O12S2  
aspirin C9H8O4  
hydroxychloroquine 49
ibuprofen 33
crestor 121
aspirin 21
@回音 SETLOCAL 雷姆 对于q21411489.txt中的/f标记=1*delims=%%a 设置名称= 呼叫:进程%%a REM>newfile.txt 后藤:EOF :进程 设置参数=%2 如果定义了参数集名称=%name%%1&shift&GOTO进程 设置参数=%1 集合名称=%name:~1% 设置/a计数=0 :下一个 如果未定义参数ECHO%name%%count%&转到:EOF 如果%%e=%param:~0,2%转到LTR2,则%%e在Ac Al Sb As Ba Be Bi Br Cd Ca Ce Cs Cl Cr Co Cu Dy DO中为%%e 对于Er-Gd-Ga-Ge-Au-Hf-Ho-Ir-Fe-La-Pb-Li-Lu-Mg-Mn-Hg-DO中的%%e,如果%%e==%param:~0,2%转到LTR2 对于%%e IN-Mo-Nd-Ni-Nb-Os-Pd-Po-Pr-Pm-Pa-Ra-Re-Rh-Rb-Ru-Sm-DO,如果%%e==%param:~0,2%转到LTR2 对于%%e IN-Sc-Se-Si-Ag-Na-Sr-Ta-Tc-Te-Tb-Tl-Th-Tm-Sn-Ti-Yb-Zn-Zr-DO,如果%%e==%param:~0,2%转到LTR2 对于%%e IN B C F H I N O P K S W U V Y DO,如果%%e==%param:~0,1%转到LTR1 设置计数=在%param%处出错 设置参数= 转到下一个 :ltr2 设置参数=%param:~1% :ltr1 设置/a原子=0 :天体 设置参数=%param:~1% 对于0,1,9中的/l%%e,如果%%e==%param:~0,1%,则执行该操作 集合/a原子=10*原子^+%%e 后藤天体 如果%atoms%==0集/a atoms=1 设置/a计数+=原子数 转到下一个 其中q21411489.txt包含您的列表

你的第一次计算是错误的。应该是75,而不是49 SETLOCAL 雷姆 对于q21411489.txt中的/f标记=1*delims=%%a 设置名称= 呼叫:进程%%a REM>newfile.txt 后藤:EOF :进程 设置参数=%2 如果定义了参数集名称=%name%%1&shift&GOTO进程 设置参数=%1 集合名称=%name:~1% 设置/a计数=0 :下一个 如果未定义参数ECHO%name%%count%&转到:EOF 如果%%e=%param:~0,2%转到LTR2,则%%e在Ac Al Sb As Ba Be Bi Br Cd Ca Ce Cs Cl Cr Co Cu Dy DO中为%%e 对于Er-Gd-Ga-Ge-Au-Hf-Ho-Ir-Fe-La-Pb-Li-Lu-Mg-Mn-Hg-DO中的%%e,如果%%e==%param:~0,2%转到LTR2 对于%%e IN-Mo-Nd-Ni-Nb-Os-Pd-Po-Pr-Pm-Pa-Ra-Re-Rh-Rb-Ru-Sm-DO,如果%%e==%param:~0,2%转到LTR2 对于%%e IN-Sc-Se-Si-Ag-Na-Sr-Ta-Tc-Te-Tb-Tl-Th-Tm-Sn-Ti-Yb-Zn-Zr-DO,如果%%e==%param:~0,2%转到LTR2 对于%%e IN B C F H I N O P K S W U V Y DO,如果%%e==%param:~0,1%转到LTR1 设置计数=在%param%处出错 设置参数= 转到下一个 :ltr2 设置参数=%param:~1% :ltr1 设置/a原子=0 :天体 设置参数=%param:~1% 对于0,1,9中的/l%%e,如果%%e==%param:~0,1%,则执行该操作 集合/a原子=10*原子^+%%e 后藤天体 如果%atoms%==0集/a atoms=1 设置/a计数+=原子数 转到下一个 其中q21411489.txt包含您的列表


你的第一次计算是错误的。应该是75而不是49

我喜欢MC ND的聪明方法,迭代分子式的字符并删除小写字母。通过在第一个内循环中建立数学公式,我极大地简化了算法的其余部分。现在,解决方案只需要两个FOR循环,而不是四个FOR循环

@echo off
setlocal enableDelayedExpansion
set "letters=a b c d e f g h i j k l m n o p q r s t u v w x y z"

for /f "tokens=1,2 usebackq" %%A in ("test.txt") do (
  set "form=0"
  for /f %%C in ('cmd /d /q /u /c "echo(%%B" ^| more ^| findstr /v "%letters%"') do (
    if %%C gtr 9 (set "form=!form!+1*") else set "form=!form!%%C"
  )
  if !form:~-1! == * set "form=!form:~0,-1!"
  set /a "atomCount=!form:1*+=1+!"
  echo %%A !atomCount!
)

我喜欢MC ND的聪明方法,迭代分子式的字符并删除小写字母。通过在第一个内循环中建立数学公式,我极大地简化了算法的其余部分。现在,解决方案只需要两个FOR循环,而不是四个FOR循环

@echo off
setlocal enableDelayedExpansion
set "letters=a b c d e f g h i j k l m n o p q r s t u v w x y z"

for /f "tokens=1,2 usebackq" %%A in ("test.txt") do (
  set "form=0"
  for /f %%C in ('cmd /d /q /u /c "echo(%%B" ^| more ^| findstr /v "%letters%"') do (
    if %%C gtr 9 (set "form=!form!+1*") else set "form=!form!%%C"
  )
  if !form:~-1! == * set "form=!form:~0,-1!"
  set /a "atomCount=!form:1*+=1+!"
  echo %%A !atomCount!
)

我喜欢那种化学药品。元素如下:+1@Magoo-不,最后的字符是数字3和字母O,而不是数字30。所以49是正确的。啊,我明白问题所在。这是演示文件列表中的一个输入错误。最后一个字符应该是大写字母O,而不是零。该公式在正文中是正确的。我编辑了这个问题来修正演示文件中的公式。我喜欢这个化学。元素如下:+1@Magoo-不,最后的字符是数字3和字母O,而不是数字30。所以49是正确的。啊,我明白问题所在。这是演示文件列表中的一个输入错误。最后一个字符应该是大写字母O,而不是零。该公式在正文中是正确的。我编辑了这个问题来修正演示文件中的公式。+1,非常聪明有效的方法来迭代字符和删除小写字符-完全开箱即用的思想。其余部分可以大大简化。请参阅+1,这是一种非常聪明和有效的方法,可以迭代字符并删除小写字符-完全是开箱即用的思想。其余部分可以大大简化。只看传统的简化,
你可以更换if!形式:~-1!刚设置的行形式=!形态+0,下一行将处理它。只是为了传统的简化,您可以替换if!形式:~-1!刚设置的行形式=!形态+0,下一行将处理它。