从下载的数据中提取 CAS 编号

Extract CAS Number from Downloaded Data

我已经从 Pubchem 下载了一个包含 5000 多条记录的 CSV 文件。其中一列包含一堆计算的同义词,其中 CAS 编号是我希望提取的记录。不幸的是,CAS 编号不一定在此列表中处于相同位置,这使得按分隔符拆分更加困难。下面是源数据示例和我想要实现的期望输出。

前一段时间 post 的较旧答案使用 Regex 函数提取具有给定长度的数字字符串。

fnRegexExtr

let   fx=(text,regex)=>
    Web.Page(
        "<script>
            var x='"&text&"';
            var y=new RegExp('"&regex&"','g');
            var b=x.match(y);
            document.write(b);
        </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}

in
fx

不确定这是否可行并且不熟悉正则表达式,但我想知道是否可以修改此函数以提取 CAS 编号。难点在于 CAS 编号可以采用多种格式 CAS 编号最长可达 10 位数字,格式为 xxxxxxx-yy-z。

如果有人有任何替代解决方案来使用这种有点复杂的数据提取 CAS 编号,请随时 post。

数据:

cid 和 cmpdname 可以是任何东西。

1-Aminopropan-2-ol|1-AMINO-2-PROPANOL|78-96-6|Isopropanolamine|Monoisopropanolamine
1-chloro-2,4-dinitrobenzene|2,4-Dinitrochlorobenzene|97-00-7|Dinitrochlorobenzene|DNCB|Chlorodinitrobenzene|CDNB
1,2-dichloroethane|Ethylene dichloride|107-06-2|Ethylene chloride|Ethane, 1,2-dichloro-|Glycol dichloride|Dutch liquid|Dutch oil|Ethane dichloride|Aethylenchloride
1,2,4-trichlorobenzene|120-82-1|Benzene, 1,2,4-trichloro-|unsym-Trichlorobenzene|Hostetex L-pec|Trojchlorobenzene
CHLOROACETALDEHYDE|2-chloroacetaldehyde|107-20-0|Chloroethanal|2-Chloroethanal|Acetaldehyde, chloro-|Chloroaldehyde|Monochloroacetaldehyde|2-Chloro-1-ethanal

在 PQ 中,这将拉出任何不包含 cmpdsynonym 中的字母的项目的内容,我认为这基本上就是您要查找的内容

   let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
   #"Added Custom" = Table.AddColumn(Source, "Custom.3", each List.RemoveNulls(List.Transform(Text.Split([cmpdsynonym],"|"), each if _ = Text.Remove (_,{"A".."Z","a".."z"}) then _ else null)){0})
   in #"Added Custom"

这是在 PQ 中执行此操作的一种方法,使用 fnRegexExtr 到 return CAS;和一个简单的 Text.Split 到 return 化合物名称:

let

//Read in data and set data type as text
    Source = Excel.CurrentWorkbook(){[Name="Compounds"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),

//Transform to desired output
    Result = Table.FromColumns(
        {List.Transform(#"Changed Type"[Column1], each Text.Split(_,"|")){0}}
        & {List.Transform(#"Changed Type"[Column1],each fnRegexExtr(_, "\b\d{1,7}-\d{2}-\d"))},
        type table[Compound=text, CAS=text]
        )
in
    Result

原创

结果