从excel图表字符串中提取指定长度的连续数字子串

本文给出了一种从可能包含若干个不同长度的数字的字符串中提取指定长度的数字的解决方案 。在实际的工作表中,存在着许多此类需求,例如从字符串中获取6位数字账号 。
下面是一个示例:
20/04/15 – VAT Reg: 1234567: Please send123456 against Order #98765, Customer Code A123XY, £125.00
从该字符串中提取出现的一个6位数字(123456) 。
【从excel图表字符串中提取指定长度的连续数字子串】在字符串中正确定位一个6位数字,需要考虑在与任意6个连续数字的字符串相邻的之前和之后的字符,并验证这两个字符都不是数字 。
在这里,将介绍两种解决方案,第一种是静态的,要提取的数字长度是固定的;第二种是动态的,允许长度变化 。
假设字符串在单元格A1中,则公式为:
=0+MID(“ζ”&A1&”ζ”,1+MATCH(26,MMULT(N(ISERR(0+MID(MID(“ζ”&A1&”ζ”,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)-5)),8),{1,2,3,4,5,6,7,8},1))),{13;1;1;1;1;1;1;13}),0),6)
先看看公式中的:
ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)-5))
这是我们很熟悉的一个结构,简单地生成一个整数数组,该数组由1到A1中字符串长度(此处为99)减去5的值组成,即:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94}
这个值(此处为5)的选择必须比我们要提取的数字的长度小1,因为这意味着当我们将此数组传递给MID函数作为其参数start_num的值时,确保将考虑A1中字符串长度为8的所有子字符串 。
但是,这里使用5而不是7的原因是,必须确保首先在字符串的开头和结尾连接单个非数字字符 。由于解决方案的关键之处在于有效地测试所有长度为8个字符的子字符串,并验证其中的子字符串依次由1个非数字、6个数字和1个非数字组成 。对于6个数字处于字符串的开头或结尾的情况,进行适当调整 。这样:
MID(“ζ”&A1&”ζ”,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)-5)),8)
转换为:
MID(“ζ20/04/15 – VAT Reg: 1234567: Please send 123456 againstOrder #98765, Customer Code A123XY, £125.00ζ”,{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94},8)
得到:
{“ζ20/04/1″;”20/04/15″;”0/04/15”;”/04/15 -“;”04/15 – “;”4/15 – V”;”/15- VA”;”15 – VAT”;”5 – VAT “;” – VATR”;”- VAT Re”;” VAT Reg”;”VAT Reg:”;”ATReg: “;”T Reg: 1″;” Reg: 12″;”Reg:123″;”eg: 1234″;”g: 12345″;”: 123456″;”1234567″;”1234567:”;”234567: “;”34567:P”;”4567: Pl”;”567: Ple”;”67: Plea”;”7:Pleas”;”: Please”;” Please “;”Pleases”;”lease se”;”ease sen”;”ase send”;”sesend “;”e send 1″;” send 12″;”send123″;”end 1234″;”nd 12345″;”d 123456″;”123456 “;”123456 a”;”23456 ag”;”3456aga”;”456 agai”;”56 again”;”6 agains”;”against”;”against “;”gainst O”;”ainstOr”;”inst Ord”;”nst Orde”;”st Order”;”tOrder “;” Order #”;”Order #9″;”rder#98″;”der #987″;”er #9876″;”r #98765″;”#98765,”;”#98765, “;”98765, C”;”8765,Cu”;”765, Cus”;”65, Cust”;”5, Custo”;”,Custom”;” Custome”;”Customer”;”ustomer”;”stomer C”;”tomer Co”;”omer Cod”;”merCode”;”er Code “;”r Code A”;” CodeA1″;”Code A12″;”ode A123″;”de A123X”;”eA123XY”;” A123XY,”;”A123XY, “;”123XY,£”;”23XY, £1″;”3XY, £12″;”XY, £125″;”Y,£125.”;”, £125.0″;” £125.00″;”£125.00ζ”}

推荐阅读