字符串的分割和连接

按照指定字符对给定字符串进行分割,或者用指定字符对给定的多个字符串进行连接是经常遇到的字符串处理任务,本节介绍进行字符串分割和连接的方法。

字符串的分割

【Excel VBA】

Excel VBA中使用Split函数用指定的分隔符分割字符串,分割后得到的子字符串放在一个数组中。第8章介绍数组。

下面给定一个字符串,指定空格为分隔符,用Split函数进行分割。示例文件的存放路径为Samples\ch06\Excel VBA\分割和连接.xlsm。

code.vba
Sub Test()
  Dim strL As String
  Dim strArray() As String
  strL = "Hello dqexcel VBA"
  strArray = Split(strL, " ")  '分割字符串
  Debug.Print strArray(0)
  Debug.Print strArray(1)
  Debug.Print strArray(2)
End Sub

分割后的子字符串放在数组strArray中,运行程序,在立即窗口中输出它们。

code.vba
Hello
dqexcel
VBA

【Python】

使用字符串的split方法,用指定字符作为间隔,对给定的字符串进行分割。例如,下面用空格作为间隔,对字符串"Hello dqexcel VBA"进行分割,结果以列表的形式给出。第3章介绍列表。

code.python
>>> 'Hello dqexcel VBA'.split(' ')
['Hello', 'dqexcel', 'VBA']

默认时split方法以空格作为分隔符进行分割,例如:

code.python
>>> 'Hello dqexcel VBA'.split()
['Hello', 'dqexcel', 'VBA']

字符串的分割示例-分割物资规格

图6-4所示表中,D列为物资规格数据,即物资外观的长宽高数据,以长*宽*高的形式表示。现在对每行的规格数据进行分割,提取出长、宽和高数据分3列显示。

Document Image

图6-4 分割物资规格

【Excel VBA】

遍历D列每行数据,使用Split函数,用*号对规格数据进行分割,得到的数据保存在一个数组中,按顺序即为物资外观的长、宽和高数据,分别输出到对应行的G列、H列和I列。示例文件的存放路径为Samples\ch06\Excel VBA\分割物质规格.xlsm。

code.vba
Sub Test()
  Dim intI As Integer
  Dim intJ As Integer
  Dim intR As Integer
  Dim strT0 As String
  Dim strT
  '数据行数
  intR = ActiveSheet.Range("D1").End(xlDown).Row
  '遍历第4列中的物资规格
  For intI = 2 To intR
    '对于当前规格,用*作为分隔符进行分割
    strT0 = ActiveSheet.Cells(intI, 4).Value
    strT = Split(strT0, "*")
    '输出分割得到的长、宽和高
    ActiveSheet.Cells(intI, 7).Value = CInt(strT(0))
    ActiveSheet.Cells(intI, 8).Value = CInt(strT(1))
    ActiveSheet.Cells(intI, 9).Value = CInt(strT(2))
  Next
End Sub

运行程序,在工作表中第G-I列输出结果,如图6-4中所示。

【Python】

遍历D列每行数据,使用字符串的split方法,用*号对规格数据进行分割,得到的数据保存在一个数组中,按顺序即为物资外观的长、宽和高数据,分别输出到对应行的G列、H列和I列。本示例的数据文件存放路径为Samples\ch06\Python\分割物质规格.xlsx,py文件保存在相同目录下,文件名为sam06-04.py。

code.python
import xlwings as xw  #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os  #导入os包
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+\
    r'\分割物质规格.xlsx',read_only=False)
sht=bk.sheets(1)  #获取第1个工作表
#工作表中第4列数据最大行号
rows=sht.api.Range('D1').End(Direction.xlDown).Row
n=1  #记录当前行号
#遍历数据区域的单元格
for rng in sht.range('D2:D'+str(rows)):
    n+=1  #行号加1
    #对于当前规格,用*作为分隔符进行分割
    lst=rng.value.split('*')
    #输出分割得到的长、宽和高
    sht.cells(n,7).value=lst[0]
    sht.cells(n,8).value=lst[1]
    sht.cells(n,9).value=lst[2]

运行脚本,在工作表中第G-I列输出结果,如图6-4中所示。

字符串的连接

在Excel VBA和Python中可以使用连接运算符连接字符串。

【Excel VBA】

Excel VBA中可以使用&连接字符串。下面定义两个字符串,然后连接它们构成一个新的字符串。示例文件的存放路径为Samples\ch06\Excel VBA\分割和连接.xlsm。

code.vba
Sub Test2()
  Dim strA As String
  Dim strB As String
  strA = "Hello"
  strB = "VBA"
  Debug.Print strA & " " & strB
End Sub

注意,也可以使用+连接字符串,但是建议不使用它,因为在某些场景下会产生歧义。

运行程序,在立即窗口中输出连接后的字符串。

code.vba
Hello VBA

【Python】

字符串的连接有使用加号、*、空格和join方法等几种方法。下面用加号连接两个字符串:

code.python
>>> a='hello '
>>> b='dqexcel'
>>> a+b
'hello dqexcel'

使用*可以重复输出指定字符串,例如

code.python
>>> a='dqexcel '
>>> a*3

'dqexcel dqexcel dqexcel '

使用print函数,其参数用空格间隔几个字符串,空格能起到连接的作用。例如:

code.python
>>> print('hello ' 'dqexcel')
hello dqexcel

也可以使用函数连接字符串。

【Excel VBA】

使用Join函数用指定的分隔符连接字符串。进行连接的字符串必须先放到一个数组中。关于数组,请参见第7章。下面创建两个字符串,将它们放在数组strArr中,指定分隔符为空格,用Join函数进行连接。示例文件的存放路径为Samples\ch06\Excel VBA\分割和连接.xlsm。

code.vba
Sub Test3()
  Dim strA As String
  Dim strB As String
  Dim strArr(1) As String
  strA = "Hello"
  strB = "VBA"
  strArr(0) = strA
  strArr(1) = strB
  Debug.Print Join(strArr, " ")
End Sub

运行程序,在立即窗口中输出连接后的字符串。

code.vba
Hello VBA

【Python】

使用字符串的join方法,用指定字符或字符串间隔给定的多个字符串。例如下面用逗号间隔给定字符串的各个字符:

code.python
>>> a=','
>>> b='abc'
>>> a.join(b)
'a,b,c'

或者变量b引用的字符串用列表给出,用变量a引用的字符串间隔列表各元素。如:

code.python
>>> a=','
>>> b=['hello','abc','dqexcel']
>>> a.join(b)
'hello,abc,dqexcel'

字符串的连接示例-合并学生个人信息

将图6-5所示工作表中第1-3列的学生信息合并为第4列的形式。

Document Image

图6-5 合并学生个人信息

【Excel VBA】

遍历各行,使用Join函数,用换行符连接第1-3列的数据,将结果显示在第4列。示例文件的存放路径为Samples\ch06\Excel VBA\合并学生个人信息.xlsm。

code.vba
Sub Test()
  Dim intI As Integer
  Dim intR As Integer
  Dim strT(2) As String
  '数据行数
  intR = ActiveSheet.Range("A1").End(xlDown).Row
  '遍历各行数据
  For intI = 2 To intR
    '将当前行的前三列数据进行合并
    strT(0) = "姓名:" & ActiveSheet.Cells(intI, 1).Value
    strT(1) = "性别:" & ActiveSheet.Cells(intI, 2).Value
    strT(2) = "准考证号:" & ActiveSheet.Cells(intI, 3).Value
    '合并的连接符为换行符
    ActiveSheet.Cells(intI, 4).Value = Join(strT, vbLf)
  Next
End Sub

运行程序,在工作表中第4列输出结果,如图6-5中所示。

【Python】

遍历各行,使用字符串的join方法,用换行符连接第1-3列的数据,将结果显示在第4列。本示例的数据文件存放路径为Samples\ch06\Python\合并学生个人信息.xlsx,py文件保存在相同目录下,文件名为sam06-05.py。

code.python
import xlwings as xw  #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os  #导入os包
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+\
    r'\合并学生个人信息.xlsx',read_only=False)
sht=bk.sheets(1)  #获取第1个工作表
#工作表中第1列数据最大行号
rows=sht.api.Range('A1').End(Direction.xlDown).Row
#遍历第2行到末行
for i in range(2,rows+1):
    lst=[]
    #将当前行的前三列数据进行合并
    lst.append('姓名:'+str(sht.cells(i,1).value))
    lst.append('性别:'+str(sht.cells(i,2).value))
    lst.append('准考证号:'+str(sht.cells(i,3).value))
    #合并的连接符为换行符
    sht.cells(i,4).value='\n'.join(lst)

运行脚本,在工作表中第4列输出结果,如图6-5中所示。