vb中spilt的使用

在某个文本文件中,有类似如下内容:
1234 abcd
5678 efgh
9012 ffff

即一行中有两部分的数据,它们之间可能用1-4个空格或者一个tab来分开。
应该怎样才能将它们spilt开?谢谢。

建议:
1. 先用Replace函数将文件中的 tab 替换成 空格
2. 然后再用split分开,以空格为基准,这时你又有两种办法:
<1> 一行一行的读,读一行拆一行,因为你的空格数不一定,所以数组的上限也会不确定,这
个没关系,你只需要数组的第一个数 拆分数组(0) 和最后一个数 拆分数组(ubound(拆
分数组)) 即可

<2> 读取文件的全部内容,整体拆分,然后循环判断你的 拆分数组 的每一项是否为 空格,
如果不为空格,就将数据另存到另外一个数组中,循环完后记得销毁原数组,释放内存
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-01
split功能有限,给你一段代码,VB6的,很久以前写的但是很有效:
说明:这段代码可以实现你的拆分,还可以差分带单引号的字符串;你可以自己再修改提高一下效率,如果处理的数据不多就直接用吧。
ckStr1 是输入字符串
ckRetNum 是返回的拆分后的字符串个数
ckRetStr() 是返回的拆分后的字符串数组
=========================================================================
Option Explicit
Dim mErrString As String
Public Function GetStrArray(ckStr1 As String, ckRetNum As Long, ckRetStr() As String) As Long
Dim Str1 As String, strChr As String, strTemp As String
Dim loStr As Long, i As Long, j As Long, k As Long
Dim vStart As Long, vEnd As Long
Dim tempVar(100) As String, NumOfVar As Long
Dim bVar(300) As String * 1, lenbVar As Long
Dim resVar(300) As String, NumRes As Long
Dim ReadType As Long, ErrCode As Long
Dim addNum As Long, addVar As String
Dim BZ1 As Long
Dim A1
'Debug.Print
'timer1 = Timer
'For k = 1 To 1 '10000
' Str1 = "'pr o d1' G 199 1.2 1 2** -7146 OIL "
BZ1 = 0
ckStr1 = Replace(ckStr1, vbTab, " ")
Str1 = ckStr1
loStr = Len(Str1) '= lenbVar
NumOfVar = 0
For i = 1 To loStr
bVar(i) = Mid(Str1, i, 1)
Next i
i = 1
ReadType = 0
NumRes = 0
ErrCode = 0
Do While i <= loStr
If ReadType = 0 Then
If bVar(i) <> " " And bVar(i) <> "," Then
If bVar(i) = "'" Then
ReadType = 3 '用[']开始
vStart = i + 1
BZ1 = 1
Else
'如果非空,则开始读取数据
ReadType = 2
vStart = i
BZ1 = 1
End If
ElseIf bVar(i) = "," Then
NumRes = NumRes + 1
resVar(NumRes) = ""
ReadType = 0
End If
ElseIf ReadType = 2 Then
If bVar(i) <> " " Then
If bVar(i) = "'" Then
'Debug.Print "Err", i
mErrString = "标记 " & Chr(39) & " 没有匹配的 " & Chr(39)
ErrCode = 1
BZ1 = 0
Exit Do
End If
If bVar(i) = "," Then
strTemp = Mid(Str1, vStart, i - vStart)
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart)
ReadType = 0
End If
Else
strTemp = Mid(Str1, vStart, i - vStart)
NumRes = NumRes + 1
resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
ReadType = 0
BZ1 = 0
End If
If ReadType = 0 Then
'Deal with Star * charactor
If Len(Trim(strTemp)) > 1 Then ' deal with **
If InStr(1, strTemp, "**") <> 0 Then
If Left(strTemp, 2) = "**" Then
'strTemp = "**"
ErrCode = 2
Exit Do
Else
A1 = Split(strTemp, "**")
If Not IsNumeric(A1(0)) Then
ErrCode = 3
Exit Do
Else
addNum = Val(A1(0))
If UBound(A1) > 0 Then
addVar = CStr(A1(1))
Else
addVar = ""
End If
For j = 1 To addNum
NumRes = NumRes + 1
resVar(NumRes) = "1**" & addVar
Next j
End If
End If
'strTemp = ""
Else
'NumRes = NumRes + 1
'resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
End If
Else
' NumRes = NumRes + 1
' resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
' ReadType = 0
' BZ1 = 0
'strTemp = ""
End If
End If

ElseIf ReadType = 3 Then '如果是从[']开始读取数据,并且遇到了匹配的[']结尾
If bVar(i) = "'" Then
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart)
ReadType = 0
BZ1 = 0
'strTemp = ""
End If
End If
i = i + 1
Loop
If BZ1 = 1 Then
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart + 1) 'Mid(Str1, vStart, i - vStart)
'ReadType = 0
End If
If ErrCode <> 0 Then
GetStrArray = -1
Exit Function
'Debug.Print "ErrPosition", vStart
'Debug.Print "Err Code", ErrCode
Else
'Debug.Print "timer", Timer - timer1
ckRetNum = NumRes
ReDim ckRetStr(NumRes - 1)
For i = 1 To NumRes
'Debug.Print resVar(i)
ckRetStr(i - 1) = resVar(i)
Next i
End If

End Function

========================================================================

用法:
dim str2() as string , N1 as long
dim str1 as string
str1="1234 abcd"
GetStrArray str1, N1, str2
debug.print str2(0) '1234
debug.print str2(1) 'abcd本回答被提问者采纳
第2个回答  2011-11-01
空格个数不确定 不能用spilt
你这个题很简单 只有两段 直接用left right就行了

Dim strs As String, a As String, b As String
Dim i As Integer
strs = "1234 abcd" '这儿无论多少空格都没关系
i = InStr(strs, " ")
If i > o Then
a = Trim(Left(strs, i))
b = Trim(Right(strs, Len(strs) - i))
End If
MsgBox a & "," & b
第3个回答  2011-11-01
1、如果两边的长度是固定的,可以用left、right函数直接取,如:left(str1,1)
2、如果两边不固定,用spilt也可以,即用replace函数循环把2、3、4个空格及一个tab都替换成1个空格,如str1=replace(str1,space(4),space(1))。。。str1=replace(str1,Chr(vbKeyTab),space(1))然后在split即可。
第4个回答  2011-11-01
对每一行用两遍split
dim va as variant
dim iA as integer
dim sA as string
va=split(str,' ')
'重新组合成字符串,但已经去掉空格
for ia=lbound(va) to ubound(va)
sa=sa & va(ia)
next
erase va

va=split(sa,chr(9))
第5个回答  2011-11-01
split功能有限,给你一段代码,VB6的,很久以前写的但是很有效:
说明:这段代码可以实现你的拆分,还可以差分带单引号的字符串;你可以自己再修改提高一下效率,如果处理的数据不多就直接用吧。
ckStr1 是输入字符串
ckRetNum 是返回的拆分后的字符串个数
ckRetStr() 是返回的拆分后的字符串数组
=========================================================================
Option Explicit
Dim mErrString As String
Public Function GetStrArray(ckStr1 As String, ckRetNum As Long, ckRetStr() As String) As Long
Dim Str1 As String, strChr As String, strTemp As String
Dim loStr As Long, i As Long, j As Long, k As Long
Dim vStart As Long, vEnd As Long
Dim tempVar(100) As String, NumOfVar As Long
Dim bVar(300) As String * 1, lenbVar As Long
Dim resVar(300) As String, NumRes As Long
Dim ReadType As Long, ErrCode As Long
Dim addNum As Long, addVar As String
Dim BZ1 As Long
Dim A1
'Debug.Print
'timer1 = Timer
'For k = 1 To 1 '10000
' Str1 = "'pr o d1' G 199 1.2 1 2** -7146 OIL "
BZ1 = 0
ckStr1 = Replace(ckStr1, vbTab, " ")
Str1 = ckStr1
loStr = Len(Str1) '= lenbVar
NumOfVar = 0
For i = 1 To loStr
bVar(i) = Mid(Str1, i, 1)
Next i
i = 1
ReadType = 0
NumRes = 0
ErrCode = 0
Do While i <= loStr
If ReadType = 0 Then
If bVar(i) <> " " And bVar(i) <> "," Then
If bVar(i) = "'" Then
ReadType = 3 '用[']开始
vStart = i + 1
BZ1 = 1
Else
'如果非空,则开始读取数据
ReadType = 2
vStart = i
BZ1 = 1
End If
ElseIf bVar(i) = "," Then
NumRes = NumRes + 1
resVar(NumRes) = ""
ReadType = 0
End If
ElseIf ReadType = 2 Then
If bVar(i) <> " " Then
If bVar(i) = "'" Then
'Debug.Print "Err", i
mErrString = "标记 " & Chr(39) & " 没有匹配的 " & Chr(39)
ErrCode = 1
BZ1 = 0
Exit Do
End If
If bVar(i) = "," Then
strTemp = Mid(Str1, vStart, i - vStart)
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart)
ReadType = 0
End If
Else
strTemp = Mid(Str1, vStart, i - vStart)
NumRes = NumRes + 1
resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
ReadType = 0
BZ1 = 0
End If
If ReadType = 0 Then
'Deal with Star * charactor
If Len(Trim(strTemp)) > 1 Then ' deal with **
If InStr(1, strTemp, "**") <> 0 Then
If Left(strTemp, 2) = "**" Then
'strTemp = "**"
ErrCode = 2
Exit Do
Else
A1 = Split(strTemp, "**")
If Not IsNumeric(A1(0)) Then
ErrCode = 3
Exit Do
Else
addNum = Val(A1(0))
If UBound(A1) > 0 Then
addVar = CStr(A1(1))
Else
addVar = ""
End If
For j = 1 To addNum
NumRes = NumRes + 1
resVar(NumRes) = "1**" & addVar
Next j
End If
End If
'strTemp = ""
Else
'NumRes = NumRes + 1
'resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
End If
Else
' NumRes = NumRes + 1
' resVar(NumRes) = strTemp 'Mid(Str1, vStart, i - vStart)
' ReadType = 0
' BZ1 = 0
'strTemp = ""
End If
End If

ElseIf ReadType = 3 Then '如果是从[']开始读取数据,并且遇到了匹配的[']结尾
If bVar(i) = "'" Then
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart)
ReadType = 0
BZ1 = 0
'strTemp = ""
End If
End If
i = i + 1
Loop
If BZ1 = 1 Then
NumRes = NumRes + 1
resVar(NumRes) = Mid(Str1, vStart, i - vStart + 1) 'Mid(Str1, vStart, i - vStart)
'ReadType = 0
End If
If ErrCode <> 0 Then
GetStrArray = -1
Exit Function
'Debug.Print "ErrPosition", vStart
'Debug.Print "Err Code", ErrCode
Else
'Debug.Print "timer", Timer - timer1
ckRetNum = NumRes
ReDim ckRetStr(NumRes - 1)
For i = 1 To NumRes
'Debug.Print resVar(i)
ckRetStr(i - 1) = resVar(i)
Next i
End If

End Function

========================================================================

用法:
dim str2() as string , N1 as long
dim str1 as string
str1="1234 abcd"
GetStrArray str1, N1, str2
debug.print str2(0) '1234
debug.print str2(1) 'abcd本回答被提问者采纳
第6个回答  2011-11-01
空格个数不确定 不能用spilt
你这个题很简单 只有两段 直接用left right就行了

Dim strs As String, a As String, b As String
Dim i As Integer
strs = "1234 abcd" '这儿无论多少空格都没关系
i = InStr(strs, " ")
If i > o Then
a = Trim(Left(strs, i))
b = Trim(Right(strs, Len(strs) - i))
End If
MsgBox a & "," & b
第7个回答  2011-11-01
1、如果两边的长度是固定的,可以用left、right函数直接取,如:left(str1,1)
2、如果两边不固定,用spilt也可以,即用replace函数循环把2、3、4个空格及一个tab都替换成1个空格,如str1=replace(str1,space(4),space(1))。。。str1=replace(str1,Chr(vbKeyTab),space(1))然后在split即可。
第8个回答  2011-11-01
对每一行用两遍split
dim va as variant
dim iA as integer
dim sA as string
va=split(str,' ')
'重新组合成字符串,但已经去掉空格
for ia=lbound(va) to ubound(va)
sa=sa & va(ia)
next
erase va

va=split(sa,chr(9))
相似回答
大家正在搜