Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel公式技巧13: 从字符串中提取数字——将所有数字提取到单个单元格

Excel公式技巧13: 从字符串中提取数字——将所有数字提取到单个单元格

作者头像
fanjy
发布于 2020-03-16 02:35:30
发布于 2020-03-16 02:35:30
3K0
举报
文章被收录于专栏:完美Excel完美Excel

前三篇文章分别讲解了提取位于字符串开头和末尾的数字的公式技术、提取字符串中所有的数字并放在不同的单元格中的公式技术,本文研究从字符串中提取所有数字并将这些数字作为单个数字放置在单个单元格中的技术。

本文使用与上一篇文中相同的字符串:

81;8.75>@5279@4.=45>A?A;

我们希望公式能够返回:

818755279445

解决方案

相对简洁的数组公式:

=NPV(-0.9,IFERROR(MID(A1,1+LEN(A1)-ROW(INDIRECT("1:"& LEN(A1))),1)/10,""))

原理解析

现在,我们应该很熟悉ROW/INDIRECT函数组合了:

ROW(INDIRECT("1:" & LEN(A1)))

生成由1至单元格A1中的字符串长度数组成的数组,本例中A1里的字符串长度为24,因此得到:

{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24}

由1+LEN(A1)=25减去该数组,即:

25-{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24}

得到:

{24;23;22;21;20;19;18;17;16;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1}

即公式中MID函数的参数start_num的值,这样:

MID(A1,1+LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))),1)

转换为:

MID("81;8.75>@5279@4.=45>A?A;",{24;23;22;21;20;19;18;17;16;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1},1)

得到:

{";";"A";"?";"A";">";"5";"4";"=";".";"4";"@";"9";"7";"2";"5";"@";">";"5";"7";".";"8";";";"1";"8"}

再由10除这个数组,得到:

{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;0.5;0.4;#VALUE!;#VALUE!;0.4;#VALUE!;0.9;0.7;0.2;0.5;#VALUE!;#VALUE!;0.5;0.7;#VALUE!;0.8;#VALUE!;0.1;0.8}

传递给IFERROR函数,得到:

{"";"";"";"";"";0.5;0.4;"";"";0.4;"";0.9;0.7;0.2;0.5;"";"";0.5;0.7;"";0.8;"";0.1;0.8}

继续之前,我们先看看NPV函数。

NPV函数具有一个好特性,可以忽略传递给它的数据区域中的空格,仅按从左至右的顺序操作数据区域内的数值。

NPV函数的语法为:

NPV(rate,value1,value2,value3,,,)

等价于计算下列数的和:

=value1/(1+rate)^1+value2/(1+rate)^2+value3/(1+rate)^3+...

为了生成想要的结果,需将数组中的元素乘以连续的10的幂,然后将结果相加,可以看到,如果为参数rate选择合适的值,此公式将为会提供精确的结果。因此,选择-0.9,不仅因为1-0.9显然是0.1,而且从指数1开始采用0.1的连续幂时,得到:

0.1

0.01

0.001

0.0001

相应地得到:

10

100

1000

10000

因此,在示例中,生成的数组的第一个非空元素是0.5,将乘以10;第二个元素0.4乘以100,第三个元素0.4乘以1000,依此类推。

这样,公式:

=NPV(-0.9,IFERROR(MID(A1,1+LEN(A1)-ROW(INDIRECT("1:"& LEN(A1))),1)/10,""))

转换成:

=NPV(-0.9,{"";"";"";"";"";0.5;0.4;"";"";0.4;"";0.9;0.7;0.2;0.5;"";"";0.5;0.7;"";0.8;"";0.1;0.8})

得到:

818755279445

注意,应对单元格进行格式设置,否则可能结果是货币形式或者指数形式。也可以在公式中添加一个INT函数来确保输出的是整数:

=INT(NPV(-0.9,IFERROR(MID(A1,1+LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))),1)/10,"")))

其实,还有更复杂的公式可以实现,例如数组公式:

=SUM(MID(A1,LARGE(IF(ISNUMBER(0+MID(A1,Arry1,1)),Arry1),ROW(INDIRECT("1:"&COUNT(0+MID(A1,Arry1,1))))),1)*10^(ROW(INDIRECT("1:"&COUNT(0+MID(A1,Arry1,1))))-1))

公式中的Arry1是定义的名称:

=ROW(INDIRECT("1:"&LEN($A1)))

一对比,就会感叹这样巧妙的公式应用了,只能说佩服!

注:本技巧整理自excelxor.com,有兴趣的朋友可以研阅原文,特别是原文后面的评论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2023/09/14
1K0
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
奇奇怪怪的ORA-01841错误,分析处理过程(全)
最近,遇到了一个关于ORA-01841的报错,起初,认为这个错误处理起来应该不困难,但实际上折腾了很久,才最终找到问题原因,并解决掉,下面将本次解决和分析的过程用样例来说明。
数据和云
2021/01/12
5K0
Oracle 索引监控(monitor index)
      合理的为数据库表上创建战略性索引,可以极大程度的提高了查询性能。但事实上日常中我们所创建的索引并非战略性索引,恰恰是大量冗余或是根本没有用到的索引耗用了大量的存储空间,导致DML性能低下。Oracle 提供了索引监控特性来初略判断未使用到的索引。本文描述如何使用Oracle 索引的监控。
Leshami
2018/08/14
1K0
关于修改数据库参数的测试(r3笔记第18天)
在性能调优的时候,会发现很多类型的问题,有些问题可能通过使用隐含参数就能够解决,不过这种变更需要特别注意,因为做隐含参数的变更无形中会影响到其它的sql语句运行。如果为了个别的问题而做了变更,导致了整个系统问题,那就得不偿失了,这中变更一定得经过测试,至少在测试环境中部署测试过,而且解决的问题可能是通用的,要不真是吃力不讨好。 个人建议有下面的步骤: 在测试环境部署。 测试前设定baselin,修改后,在同样的负载下对比性能情况,是否有明显的抖动。 分析收集的信息,进行评估,是否达到预期的目标。 现在生产
jeanron100
2018/03/14
6910
关于直方图(histogram)使用的一个特殊案例
有客户反映,一个选择性很好的字段(保存完整路径的文件名)filename,定义为varchar2(200),字段的前面部分大部分是相同的(路径相同),做等值查询时(where filename='xxxxxxxx'),没有使用索引,而是使用了全表扫描。
老虎刘
2022/06/22
3800
Oracle AWR 阙值影响历史执行计划
      最近有网友提到为什么在dba_hist_sql_plan中无法查看到sql语句的历史执行计划,对于这个问题是由于缺省情况下,Oracle 设定的阙值并非捕获所有的sql语句,所以无法看到某些sql历史执行计划乃正常现象。在Oracle 9i的时候,我们可以通过设定不同的快照level获得不同程度的详细信息。也可以单独配置收集sql的阙值,如指定sql的执行次数,磁盘读的次数,解析调用的数量等。所有超出这个设置的sql语句都收集到snapshot之中。Oracle 10g,11g也有相应的设置。下面来描述这个问题。
Leshami
2018/08/14
7130
使用SQL tuning advisor(STA)自动优化SQL
      Oracle 10g之后的优化器支持两种模式,一个是normal模式,一个是tuning模式。在大多数情况下,优化器处于normal模式。基于CBO的normal模式只考虑很小部分的执行计划集合用于选择哪个执行计划,因为它需要在尽可能短的时间,通常是几秒或毫秒级来对当前的SQL语句进行解析并生成执行计划。因此并不能保证SQL语句每次都是使用最佳的执行计划。而tuning模式则将高负载的SQL语句直接扔给优化器,优化器来自动对其进行详细的分析,调试并给出建议,这就是Oracle 提供的Automatic Tuning Optimizer,即自动调整优化器。Oracle 自动调整优化器通过SQL调优建议器(SQL tuning advisor)来体现。
Leshami
2018/08/14
1.7K0
使用SQL tuning advisor(STA)自动优化SQL
Oracle的直方图试验
默认的,如果一个倾斜列上的唯一值超过了254个,那么Oracle会对此列建立高度均衡直方图,否则建立频率直方图。
数据和云
2021/07/09
8690
供收藏:Oracle固定SQL执行计划的方法总结
Oracle数据库中执行sql的时候,优化器会根据优化器统计信息和一些参数来生成“它认为最好的“执行计划。
SQLplusDB
2022/08/19
1.5K0
【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
基数反馈(Cardinality Feedback,CFB)是Oracle 11gR2出现的一个新特性,它的出现是为了帮助Oracle优化器依据更精准的基数生成更加优秀的执行计划。基数的评估准确与否,对于优化器异常重要,直接影响到后续的JOIN COST等重要的成本计算评估。若评估不当则会造成CBO选择不当的执行计划。此技术对于仅执行一次的SQL无效,在SQL第一次执行时,记录存储实际的基数和评估的基数之间的差异,如果差异较大,在第二次执行时,优化器会依据实际的基数重新决策生成执行计划,但是需要注意的是,当使用更准确的基数重新生成执行计划时,生成的执行计划与第一次时使用的执行计划完全有可能是相同的。这个技术的出现是由于优化器在一些情况下不能很好的去计算基数的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失等等。
AiDBA宝典
2019/09/29
8150
【DB笔试面试646】在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
AiDBA宝典
2019/09/29
9350
【DB笔试面试646】在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
灌入大量数据后手工采集统计信息的重要性
SQL> create table TBL_STAT as select * from dba_objects where 1<>1; Table created. SQL> create index idx_tbl_stat on tbl_stat (object_id); Index created. SQL> select count(*) from tbl_stat;   COUNT(*) ----------          0
bisal
2019/01/29
3520
Oracle 历史SQL语句执行计划的对比与分析
    基于CBO优化器的环境中,SQL执行计划的生成依赖于统计信息的真实与完整。如列的离散度,列上的直方图,索引的可用性,索引上的聚簇因子。当这些信息是真实完整的情况下,CBO优化器通常都可以制定最优的执行计划。也正因此CBO优化器也灵活,难以控制,任一信息的不真实或缺失都可能导致执行计划发生变化而产生多个版本。经常碰到的情形是之前的某个SQL语句前阵子还不是TOP SQL,而最近变成了TOP SQL。或者说之前尽管是TOP SQL但,但最近尽然成了TOP 1。对于此情形,我们可以比对SQL语句的历史执行计划进行分析是何种原因导致SQL变慢或执行计划发生变化。下面通过例子来模拟SQL执行计划变异的情形。 1、创建演示环境
Leshami
2018/08/13
1.3K0
【每日一摩斯】-Index Skip Scan Feature (212391.1)
INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式。
bisal
2019/01/29
3700
六千字带你了解 Oracle 统计信息和执行计划
前几天,微信上收到《Oracle DBA工作笔记》、《MySQL DBA工作笔记》作者,DBAplus社群联合发起人杨建荣老师的邀请,说在他的 QQ 群里分享一下技术类、职场类、感悟类的文章,我顿时感到诚惶诚恐,荣幸之至,分享也是一个学习的过程呀,便欣然答应了杨老师的邀请。想着最近也在学习优化相关的东西,那就一边学习一边总结分享,文中如有其它不到之处,还请多多指教。
JiekeXu之路
2020/04/20
3.4K0
Oracle 全表扫描及其执行计划(full table scan)
    全表扫描是Oracle访问数据库表是较为常见的访问方式之一。很多朋友一看到SQL语句执行计划中的全表扫描,就要考虑对其进行修理一番。全表扫描的存在,的确存在可能优化的余地。但事实上很多时候全表扫描也并非是最低效的,完全要看不同的情形与场合,任一方式都是有利有弊的,也就是具体情况要具体分析。本文描述了什么是全表扫描以及何时发生全表扫描,何时全表扫描才低效。   本文涉及到的相关链接: 高水位线和全表扫描 启用 AUTOTRACE 功能 Oracle 测试常用表BIG_TABLE Oracle
Leshami
2018/08/13
2.9K0
【DB笔试面试628】Oracle的统计信息包括哪几种类型?
Oracle数据库里的统计信息是一组存储在数据字典里,且从多个维度描述了数据库里对象的详细信息的一组数据。当Oracle数据库工作在CBO(Cost Based Optimization,基于代价的优化器)模式下时,优化器会根据数据字典中记录的对象的统计信息来评估SQL语句的不同执行计划的成本,从而找到最优或者是相对最优的执行计划。所以,可以说,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式来生成执行计划。统计信息决定着SQL的执行计划的正确性,属于SQL执行的指导思想。若统计信息不准确,则会导致表的访问方式(例如应该使用索引,但是选择了全表扫描)、表与表的连接方式出现问题(例如应该使用HJ,但是使用了NL连接),从而导致CBO选择错误的执行计划。
AiDBA宝典
2019/09/29
7840
【DB笔试面试628】Oracle的统计信息包括哪几种类型?
Oracle 12c数据库优化器统计信息收集的最佳实践(一)
原文链接 http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 译者 刘金龙 导 语 Oracle优化器会为SQL语句产生所有可能的访问路径(执行计划),然后从中选择一条COST值最低的执行路径,这个cost值是指oracle估算执行SQL所消耗的资源。为了让优化器能够精确计算的每一条执行计划的COST值,这就需要被执行SQL语句所需访问的所有对象(表和
沃趣科技
2018/03/26
1.8K0
Oracle 12c数据库优化器统计信息收集的最佳实践(一)
极限优化:从75到2000,由技能到性能提升岂止80倍
崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。 崔华手记:这篇文章的标题颇有些标题党的味道,但这不是我的初衷。其实我想表达的是,基于RDBMS的应用系统的性能问题绝大多数都是和SQL直接相关,而基于Oracle数据库的SQL优化能否奏效、效果的好与坏归根结底比拼的还是对CBO和执行计划的理解程度,这也正是我在《基于Oracle的SQL优化》一书中提出来的SQL优化方法论的第一点
数据和云
2018/03/06
1.4K0
极限优化:从75到2000,由技能到性能提升岂止80倍
Oracle 聚簇因子(Clustering factor)
    聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外部表等。如此这般,那到底什么是聚簇因子,那些情况下会影响到聚簇因子,以及如何提高聚簇因子?本文将对此展开描述。
Leshami
2018/08/14
1.8K0
Oracle 聚簇因子(Clustering factor)
推荐阅读
相关推荐
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档