Board logo

标题: [文本处理] [已解决]批处理如何给数字前加指定字符 [打印本页]

作者: sweet惜缘    时间: 2015-8-3 17:36     标题: [已解决]求解批处理如何提取指定内容?

本帖最后由 pcl_test 于 2016-1-11 02:08 编辑

文档由于过大,已上传至百度网盘,地址如下:http://yun.baidu.com/share/link? ... 6&uk=2400164940

我有一个文档,需要提取一下红色标注部分,下面列出的是其中一种药物;文档中有10000+种;提取出来存到另一个文档中,如果某种药物没有Target的信息,就存为~;格式如下
Entry                     Target
D09878                HSA:1234,HSA:729230
D09899                ~


非常感谢!!!!!

%%
ENTRY       D09878                      Drug
NAME        Cenicriviroc (USAN/INN)
FORMULA     C41H52N4O4S
EXACT_MASS  696.3709
MOL_WEIGHT  696.941
ACTIVITY    Treatment of HIV infection and arthritis
REMARK      Drug group: DG01264
TARGET      chemokine receptor 5 (CCR5) antagonist [HSA:1234] [KO:K04180];
            chemokine receptor 2 (CCR2) antagonist [HSA:729230] [KO:K04177]
BRITE       Target-based classification of drugs [BR:br08310]
             Cytokine receptors
              Chemokine receptors
               chemokine receptor 2 (CCR2)
                Cenicriviroc
                 D09878  Cenicriviroc (USAN/INN)
               chemokine receptor 5 (CCR5)
                Cenicriviroc
                 D09878  Cenicriviroc (USAN/INN)
            Antiinfectives [BR:br08307]
             Antivirals
              Anti-HIV agents
               Entry / fusion inhibitor
                chemokine receptor 5 inhibitor(CCR5) antagonist
                 Cenicriviroc
                  D09878  Cenicriviroc (USAN/INN)
DBLINKS     CAS: 497223-25-3
            PubChem: 135626631
            LigandBox: D09878
ATOM        50
            1   C2x C    24.9900  -26.6700
            2   C2y C    26.3900  -26.6700
            3   C1x C    27.3700  -25.6900
            4   C1x C    27.3700  -24.2900
            5   C1x C    26.3900  -23.3100
            6   N1y N    24.9900  -23.3100
            7   C8y C    24.0100  -24.2900
            8   C8y C    24.0100  -25.6900
            9   C5a C    26.3900  -28.0700
            10  N1b N    27.5800  -28.7700
            11  C8y C    28.7700  -28.0700
            12  O5a O    25.2000  -28.7700
作者: sweet惜缘    时间: 2015-8-3 17:38

@pcl_test

召唤大神
作者: sweet惜缘    时间: 2015-8-3 18:46

求解答~~~~都要被自己笨死了
作者: pcl_test    时间: 2015-8-3 20:17

本帖最后由 pcl_test 于 2015-8-4 11:18 编辑

保存为bat文件
  1. 1>1/* :
  2. @echo off
  3. cscript -nologo -e:jscript "%~0"
  4. echo;完成!
  5. pause & exit/b
  6. */
  7. var fso = new ActiveXObject("Scripting.FileSystemObject");
  8. var f1 = fso.OpenTextFile(".\\drug", 1);
  9. var f2 = fso.CreateTextFile(".\\结果.txt", 2);
  10. f2.WriteLine('Entry       Target');
  11. while(!f1.AtEndOfStream) {
  12.     var str = f1.ReadLine().replace(/^\s{1,6}([A-Z]+.*)/,'$1');
  13.     if (/^ENTRY\s+/.test(str)) {
  14.         var t = str.replace(/^ENTRY\s+/,'').split(' ');
  15.         var s = '';
  16.         var def1 = '';
  17.         var def2 = '';
  18.     }
  19.     if (/^TARGET\s+/.test(str)) {
  20.         def1 = 1;
  21.         s = s+str;
  22.     }
  23.     var u = /^[A-Z]+/.test(str);
  24.     if (def1&&!u){
  25.         s = s+str;
  26.         def2 = 1;
  27.     }
  28.     if (def1&&def2&&u)def1 = '';
  29.     if (/^\/+/.test(str)){
  30.         var m = s.match(/\[HSA:[^\]]+\]/g);
  31.         if (m){
  32.             for (var i=0;i<m.length;i++) {
  33.                 var v = m[i].replace(/\[HSA:([^\]]+)\]/g, '$1').split(' ');
  34.                 for (var j=0;j<v.length;j++) {
  35.                     f2.WriteLine(t[0]+'      HSA:'+v[j]);
  36.                 }
  37.             }
  38.         }
  39.     }
  40. }
  41. f1.Close();
  42. f2.Close();
复制代码

作者: roddy    时间: 2015-8-3 23:11

哈哈,。你回复的这个冒失跟这个不匹配吧,就算不匹配也算了,你起码把如何使用告诉LZ,用批处理脚本创建一个JS脚本。
作者: 回家路上    时间: 2015-8-3 23:16

本帖最后由 回家路上 于 2015-8-3 23:18 编辑

回复 5# roddy


你应该好久没登论坛了吧,这个是这一年多兴起的Bat和JS混编。
像楼主这种复杂的匹配规则,用JS确实更简便、清晰。
在论坛搜索中输入【混编】会找到相关的技术贴。
作者: sweet惜缘    时间: 2015-8-4 09:22

回复 4# pcl_test


    大神,您好!能把我得到并且改好的NEW_DG.txt中target列的中括号去掉吗?把一对多的关系变成一对一?只有数字的加上hsa:?非常感谢!!!
格式改成这样的:

原本的:
D00011        [HSA:2741 2742 8001 2743]
D00058        2566
D00058        2567
D00058        2568
D00058        55879]
D00058        [HSA:2550
D00058        9568]
D00059        [HSA:1812]
D00059        [HSA:1813]
D00059        [HSA:1814]
D00059        [HSA:1815]


希望更改后的:
D00011        HSA:2741
D00011    HSA:2742
D00011    HSA:8001
D00011    HSA:2743
D00058        HSA:2566
D00058        HSA:2567
D00058        HSA:2568
D00058        HSA:55879
D00058        HSA:2550
D00058        HSA:9568
D00059        HSA:1812
D00059        HSA:1813
D00059        HSA:1814
D00059        HSA:1815

作者: 回家路上    时间: 2015-8-4 09:36

本帖最后由 回家路上 于 2015-8-4 09:40 编辑

回复 7# sweet惜缘

// 将代码中
  1. if (/^\/+/.test(str)){
  2. var m = s.match(/\[HSA:[^\]+]+\]/g);
  3. if (m){
  4. f2.WriteLine(t[0]+'      '+m);
  5. }else f2.WriteLine(t[0]+'      '+'~');
  6. }
复制代码
// 换为
  1. if (/^\/+/.test(str)){
  2. var m = s.match(/\[(HSA:[^\]+]+)\]/g);
  3. if (m){
  4. f2.WriteLine(t[0]+'      '+RegExp.$1);
  5. }else f2.WriteLine(t[0]+'      '+'~');
  6. }
复制代码

作者: sweet惜缘    时间: 2015-8-4 09:47

回复 8# 回家路上




    您好!能把我得到并且改好的NEW_DG.txt中target列的中括号去掉吗?把一对多的关系变成一对一?只有数字的加上hsa:?非常感谢!!!
格式改成这样的:

原本的:
D00011        [HSA:2741 2742 8001 2743]
D00058        2566
D00058        2567
D00058        2568
D00058        55879]
D00058        [HSA:2550
D00058        9568]
D00059        [HSA:1812]
D00059        [HSA:1813]
D00059        [HSA:1814]
D00059        [HSA:1815]


希望更改后的:
D00011        HSA:2741
D00011    HSA:2742
D00011    HSA:8001
D00011    HSA:2743
D00058        HSA:2566
D00058        HSA:2567
D00058        HSA:2568
D00058        HSA:55879
D00058        HSA:2550
D00058        HSA:9568
D00059        HSA:1812
D00059        HSA:1813
D00059        HSA:1814
D00059        HSA:1815

作者: sweet惜缘    时间: 2015-8-4 10:25

回复 4# pcl_test


    大神~我自己改好了~现在就只有一个问题~就是给数字前加HSA:  ?  非常感谢
    如何把
D00094        HSA:5914
D00094        5915
D00094        5916
D00095        HSA:155
改成
D00094        HSA:5914
D00094        HSA:5915
D00094        HSA:5916
D00095        HSA:155

作者: sweet惜缘    时间: 2015-8-4 10:25

回复 8# 回家路上


    您好!~我自己改好了~现在就只有一个问题~就是给数字前加HSA:  ?  非常感谢
    如何把
D00094        HSA:5914
D00094        5915
D00094        5916
D00095        HSA:155
改成
D00094        HSA:5914
D00094        HSA:5915
D00094        HSA:5916
D00095        HSA:155

作者: sweet惜缘    时间: 2015-8-4 10:39     标题: [已解决]批处理如何给数字前加指定字符

想请教一下,如何给数字前加HSA:  ?  非常感谢
  

如何把
D00094        HSA:5914
D00094        5915
D00094        5916
D00095        HSA:155
改成
D00094        HSA:5914
D00094        HSA:5915
D00094        HSA:5916
D00095        HSA:155

作者: sweet惜缘    时间: 2015-8-4 10:58

@pcl_test

召唤大神!!
作者: sweet惜缘    时间: 2015-8-4 11:15

:'(:'(
求解答~~~~~
作者: pcl_test    时间: 2015-8-4 11:19

本帖最后由 pcl_test 于 2016-9-14 05:02 编辑

已修改,一步到位的
作者: pcl_test    时间: 2015-8-4 11:25

回复 7# sweet惜缘


    4楼已改,一步到位的
作者: sweet惜缘    时间: 2015-8-4 11:39

回复 4# pcl_test

非常感谢!!!!有效!!
作者: 回家路上    时间: 2015-8-4 13:14

回复 11# sweet惜缘


试一试
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "tokens=1,* delims= " %%i in (NEW_DG.txt) do (
  3. set entry=%%i
  4. set target=%%j
  5. if "!target!" neq "~" (
  6. if "!target:~0,1!" equ "[" set target=!target:~1!
  7. if "!target:~-1!" equ "]" set target=!target:~,-1!
  8. if "!target:~0,3!" neq "HSA" set target=HSA:!target!
  9. if "!target: =!" neq "!target!" (
  10. for %%i in (!target!) do (
  11. set target=%%i
  12. if "!target:~0,3!" equ "HSA" (
  13. echo;!entry!       %%i
  14. ) else (
  15. echo;!entry!       HSA:%%i
  16. )
  17. )
  18. ) else (
  19. echo;!entry!       !target!
  20. )
  21. ) else (
  22. echo;!entry!       !target!
  23. )
  24. ))>222.txt
  25. pause & exit /b
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2