Excel 字符串拆分
用 Excel 处理数据时,有时需要对字符串进行拆分。对于比较简单的拆分,使用 Excel 函数可以顺利完成,但碰到一些特殊需求,或者拆分的规则比较复杂时,则很难用 Excel 实现了。这里列出一些拆分需求示例,分析拆分难点,并提供 SPL 解决代码。SPL 是专业计算引擎 esProc 使用的语言,用于处理结构化数据运算非常方便,对于字符串拆分的运算也很简单。
一、规则单词拆分
这里有一份车间采购产品清单,清单的每一项包含了需要采购的品牌以及产品型号。现在想要把每一项的品牌以及型号拆分后单独列到后面。
文件 productlist.xlsx 中数据如下:

期望结果:

使用 Excel 来处理这类拆分时,可以使用数据的分列,但是分列有个缺点,其实也算不上缺点,只是针对这个只想拆出品牌的需求来说单词被过渡拆分了。比如后面的型号,也会被拆分到多个列,又需要重新合并,过程有点得不偿失。不过 Excel 还有一个快速填充,可以根据给定的参考值,比如第一行给定 PANASONIC,便可使用类似规则快速填充后面行的拆分,然后再用 Mid 函数间接算出型号的字符串部分,过程依然繁琐。
使用 SPL 可以直接读取 Excel 文件,对于实时分析操作,也可以将 Excel 中的数据复制到剪贴板,然后在 SPL 里面使用 clipboard 函数直接从剪贴板获取数据,数据整理完后,再将结果放入剪贴板,然后在 Excel 中粘贴结果,这样便可将 Excel 的分析操作跟 SPL 的计算无缝对接起来,方便而又高效。
SPL 拆分代码:
| A | B | |
| 1 | =clipboard().import@i() | /从剪贴板导入产品清单 |
| 2 | =A1.(~.split@1(" ")) | /从第一个空格处将产品清单分离为两部分,产生一个序列的序列 |
| 3 | =A2.concat@n("\t") | /拼接为子序列的成员用 Tab 分隔,序列的成员之间用回车分隔的二维表串 |
| 4 | =clipboard(A3) | /将串值放置到剪贴板 |
代码执行完成后,只需在B1 格粘贴便可得到期望结果。
二、数字分离
如下为一些数字跟字符混合在一起的数据,现在需要将数字和字符分离开。
文件 numbers.xlsx 中数据如下:

期望结果:

如果是光分离数字出来,仍然可以使用给定首行参考值,然后采用快速填充,便可以将所有数字分离出来。但是要将剩余的字符再分离出来,Excel 没有合适的办法,因为有些数字是跟字符交叉混合在一起,没法用 Mid 等函数拆分。只能采用 VBA 写代码逐字循环,判断字符类型,挨个分离,过程依然麻烦。
SPL 可以直接将串分离成单字符,并根据类型划分:
| A | B | |
| 1 | =clipboard().split@n() | /将剪贴板数据按回车拆分为成员,然后将成员再逐字拆分 |
| 2 | =A1.(~.align@a([true,false],isdigit(~)).(~.concat())) | /每一项字符序列用是否为数字分成两组,继而再拼成串,从而分离出数字和字符 |
| 3 | =A2.concat@n("\t") | /将两层序列分别用 Tab 和回车拼为二维表式的大串 |
| 4 | =clipboard(A3) | /将大串放置到剪贴板 |
三、日期分离
下面为一些包含日期的句子或段落,现在想要把句子里面所有的日期分离出来,一行中包含多个日期时,用分号分开。
文件 multidates.xlsx 中数据如下:

期望结果:

要将句子里面的日期分离出来,Excel 没有相应的办法,尤其像这种一个句子里面有不定个数的日期。如果是固定位置或长度的日期格式,才可能用截取固定长度,或者使用快速填充能够办到。对于上述多个日期的分离,只能写 VBA 代码,再用正则表达式去匹配解析,完成这种需求对人员要求较高,且实现过程繁琐。
SPL 直接用空格分割串为单词序列,然后按格式转换日期类型的数据:
| A | B | |
| 1 | =clipboard().split@n(“ “) | /将剪贴板数据按回车拆分成员,然后用空格将每一成员拆分为单词序列 |
| 2 | =A1.(~. (date(~,"dd.MM.yy"))) | /将单词序列的成员按照指定格式转换为日期类型的数据 |
| 3 | =A2.(~.select(ifdate(~))) | /选出序列中的日期类型的值 |
| 4 | =clipboard(A3.concat@n(“;”)) | /将日期串序列结果拼接为二维表串并放置到剪贴板 |
执行完上述代码后,直接在源表中的B1 格执行粘贴,即可得到期望结果。
四、按字符拆分
如下表为一列长度不等的数字,现在需要将数字逐字拆分成为单独的列。
文件 number.xlsx 的数据:

期望结果:

使用 Excel 拆分上述数字时,首先想到的是使用分列,但是像这种逐字拆分,分列时只能一个一个指定分隔位,数字比较长时就要多次重复设置,操作多而麻烦。其次是使用函数,比如可以在 B1 写入 =MID($A1,COLUMN(A1),1),然后拖拽鼠标进行行填充以及列填充,但这种操作不好掌握最大列数,篇幅大时,操作也不方便。
SPL 可以直接按字符拆分:
| A | B | |
| 1 | =clipboard().split@n() | /将剪贴板数据按回车拆分成员,然后每个成员再缺省拆分为单字符序列 |
| 2 | =A1.concat@n("\t") | /将拆分后的两层序列拼成串式二维表 |
| 3 | =clipboard(A2) | /将结果放置到剪贴板 |
上述代码执行完成后,同样在 B1 处粘贴拆分后的数据即可。
五、属性表和文件名拆分
如下数据为一段日志描述文件,结构相对复杂,其中包含类似于属性表的分节描述。现在想将属性描述中的 PublicKeyToken 以及文件名分离出来。
文件 log.xlsx 的数据:

期望结果:

这是一个综合串的分离,第一层为用逗号分隔的描述串,然后第二项类似于属性分节串的描述。所以使用 Excel 时,需要多次分列,以及多次快速填充,方可完成期望结果。同样是步骤多,且需要给定参考值来快速填充,过程繁琐。
SPL 提供了函数直接对属性串取值,以及对文件名的不同部分拆分:
| A | B | |
| 1 | =clipboard().split@nc() | /将剪贴板数据用回车拆分成员,然后以逗号拆分子成员序列 |
| 2 | =A1.([replace(~(2),"\"","").property("PublicKeyToken"),filename(replace(~(3),"\"",""))]) | /去掉两端引号后,用属性 property 函数从第 2 项获取 PublicKeyToken 的值;再用 filename 函数拆分出第 3 项中的文件名;再将这两个值构成序列 |
| 3 | =clipboard(A2.concat@n("\t")) | /将结果拼为大串放置到剪贴板 |
《SPL Cookbook》中有更多相关计算示例。
Excel 字符串拆分的更多相关文章
- Clickhouse 字符串拆分 OR 一行转多行
Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成
- UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理
一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...
- SQL2000/2005字符串拆分为列表通用函数
------------------------------------------------------------------ -- Author : htl258(Tony) -- Dat ...
- sql之cursor的简介和字符串拆分(split)与游标的使用
字符串拆分(split)与游标的使用 CREATE TABLE Plates ( ,), ) NOT NULL, [BusinessId] INT NOT NULL, ) ),),), SELECT ...
- SQL 字符串拆分
字符串拆分: ALTER FUNCTION [dbo].[f_Split](@sText nvarchar(max),@split NVARCHAR(20)) RETURNS @t TABLE (id ...
- php将长字符串拆分为指定最大宽度的字符串数组
/** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...
- 截取Excel字符串的部分字符
截取Excel字符串的部分字符 我们可以使用Mid.Left.Right等函数从长字符串内获取一部分字符. ①LEFT函数: LEFT(text,num_chars) Text是包含要提取字符的 ...
- 截取字符(pos,copy,Leftstr,MidStr,RightStr)以逗号为准把字符串拆分,判断字符串是否有数字、字母(大小写), 去掉字符串空格
1.copy(a,b,c) 举个例子: str := “123456”;str1 := Copy(Str,2,3);结果就是 str1 等于 234.Copy有3个参数,第一个是你要处理的字符串,第二 ...
- Java字符串拆分和字符串连接
Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...
- java解析字符串拆分单独元素
有时候,需求要求传递多个字符串参数,但是方法参数已经固定为单个String,笔者在学习unity和android之间的消息传递时就遇到这个问题,所以就写了这么一个解析字符串拆分单独元素的方法. 示例: ...
随机推荐
- JAVA 多线程---面经
线程与进程 提到进程那就要说程序,程序有指令和数据,程序从磁盘加载到内存,cpu获得指令进行执行,其中还会用到各种资源如网络资源,磁盘等.一个程序从磁盘进入内存,就是进程实例的创建. 一个程序可以有多 ...
- TypeScript实践总结
下文将TypeScript简称ts 一.为什么要学 1.1 减少bug,提高质量 强语言,语法等方面异常,编译阶段"提前"报错 支持面向对象,软件设计与工程化更为成熟,更容易做单元 ...
- 完整塔建一个spring 注解版 mybaties 过程可供复制代码
第一步引导包.新建工程maven模块 pom.xml 中导入相对应包 ++++++++++++++++++++++++++++++++++++++++++++ 1 +++++++ ...
- 闭关修炼180天----手写迷你版的tomcat-Minicat
手写迷你版的tomcat-Minicat 小谈Tomcat Tomcat请求处理⼤致过程 Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器) 我们使 ...
- koa 文件下载 pdf预览 两个接口 - nodejs - chromeDownload chromePreview
koa 文件下载 pdf预览 两个接口 - nodejs - chromeDownload chromePreview chrome.js const router = require("k ...
- 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版)
<续九>无帐号打开了itrend研究版但是用不了.今次无帐号登陆itrend研究版可以使用行情. 演示三图 1. 首先成功在金融终端无帐号登陆成功. 2. 同理应用在itrend研究版,却 ...
- FFmpeg命令行之ffplay
一.简述 ffplay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器. 二.命令格式 在安装了在命令行中输入如下格式的命令: ffplay [选项] ['输入文件'] ...
- 3DCAT为华东师大设计学院打造元宇宙数字虚拟学院
6月11日,华东师范大学设计学院在chi K11美术馆举办了一场别开生面的 2023 年本科毕业设计暨项目实践教学现场演示展.其中,元宇宙数字虚拟学院(一期)的现场发布会引起了现场震撼,吸引了众多观众 ...
- 记录--前端无感知刷新token & 超时自动退出
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端无感知刷新token&超时自动退出 一.token的作用 因为http请求是无状态的,是一次性的,请求之间没有任何关系,服务端 ...
- 记录--静态网站 H5 跳小程序,以及踩坑
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 我司有智慧功成家APP和对应的小程序,现在已经实现APP分享到微信,微信点击分享链接直接进入小程序. 目前有一个问题就是我们APP在 ...