比较复杂的需求,可能需要正则

miforum 2010-10-14 11:29:40
遇到难题。。。请见后文详述:

文本文档abc.txt中的内容格式如下:

SF A
XM 张三;李四;王五
DZ 广东省广州市天河区
SR 低保
LX 老年人;青年人;尚未成年;老年;中年
ED

SF B
XM 程真;欧阳晓兰
DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人
ED

SF A
XM 吴晓光
DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人;残疾
ED

SF C
XM 张德良
DZ 广东省中山市五桂山镇
SR 工作中
LX 老年人
ED

文档说明:

1、SF、XM等均位于本行的最前面。
2、XM、LX,这两行,有时候有分号,有时候没有分号。

需求:

XM那一行,如果遇到“;”,“;”后的词语换行;XM那一行如果没有“;”,则保持不变;除了XM那一行之外,其他所有行内容都不变。


希望得到的结果是:

SF A
XM 张三
李四
王五
DZ 广东省广州市天河区
SR 低保
LX 老年人;青年人;尚未成年;老年;中年
ED

SF B
XM 程真
欧阳晓兰
DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人
ED

SF A
XM 吴晓光DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人;残疾
ED

SF C
XM 张德良DZ 广东省中山市五桂山镇
SR 工作中
LX 老年人
ED


这个有点麻烦,因为LX那一行,有时候也有分号“;”。所以我想,用正则判断XM行,是否带有分号,有的话,则换行;没的话,则不变。大大们有什么好的解决方法呢?
...全文
118 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skylinecn 2010-10-15
  • 打赏
  • 举报
回复
呵呵,修改一下


Private Sub Command1_Click()
Open "d:\0.txt" For Binary As #1
a$ = Trim(Input(LOF(1), #1))
Close #1

s = Split(a, "XM")
For i = 1 To UBound(s)
ss = Split(s(i), vbCrLf)
If 0 < InStr(ss(0), ";") Then
s1 = Split(ss(0), ";")
ss(0) = Join(s1, vbCrLf)
s(i) = Join(ss, vbCrLf)
End If
Next i
a = Join(s, "XM")

Open "d:\1.txt" For Output As #1
Print #1, a
Close #1
End Sub
skylinecn 2010-10-15
  • 打赏
  • 举报
回复
不好意思,刚才走开了

Private Sub Command1_Click()
Open "d:\0.txt" For Binary As #1
a$ = Trim(Input(LOF(1), #1))
Close #1

s = Split(a, "XM")
For i = 1 To UBound(s)
ss = Split(s(i), vbCrLf)
If 0 < InStr(ss(0), ";") Then
s1 = Split(ss(0), ";")
ss(0) = "XM" & Join(s1, vbCrLf)
s(i) = Join(ss, vbCrLf)
End If
Next i
a = Join(s, "")

Open "d:\1.txt" For Output As #1
Print #1, a
Close #1
End Sub
ZenRoi 2010-10-15
  • 打赏
  • 举报
回复

Sub GetNewTxt()
Dim oJs As Object, Str$
Dim Arr, k%

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/XM [^↑]+/g,'')}"

Open App.Path & "\Test.txt" For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, "↑"): Reset

Arr = Split(oJs.codeobject.gets(Str), ",")
For k = 0 To UBound(Arr)
Str = Replace(Str, Arr(k), Replace(Arr(k), ";", "↑"))
Next

Str = Replace(Str, "↑", vbCrLf)
Open App.Path & "\Test.txt" For Output As #1
Print #1, Str: Reset
End Sub
chinaboyzyq 2010-10-15
  • 打赏
  • 举报
回复

Private Sub Command1_Click()
Open "c:\11.txt" For Binary As #1
Open "c:\22.txt" For Output As #2
Dim tmp1 As String, tmp2() As String, tmp3() As String
tmp1 = StrConv(InputB(LOF(1), 1), vbUnicode)
tmp2 = Split(tmp1, vbCrLf): tmp1 = ""
For i = 0 To UBound(tmp2)
If InStr(tmp2(i), "XM") > 0 And InStr(tmp2(i), ";") > 0 Then
tmp3 = Split(tmp2(i), ";")
tmp1 = tmp1 & Join(tmp3, vbCrLf) & vbCrLf
Else
tmp1 = tmp1 & tmp2(i) & vbCrLf
End If
Next
Print #2, tmp1
Close #1, #2

End Sub

miforum 2010-10-15
  • 打赏
  • 举报
回复
综合楼上各位方案,已经解决问题,真的非常感谢各位大大!!
结贴。分不多,每人一点吧。
miforum 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alzeng 的回复:]
我觉得用Fso更方便些(路径请自行修改):

VB code

Sub GetNewTxt()
Dim oJs As Object, Str$
Dim Arr, k%
Dim Fso As Object, Fl

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
……
[/Quote]

10楼的代码好像不行,没有起作用。
ZenRoi 2010-10-15
  • 打赏
  • 举报
回复
我觉得用Fso更方便些(路径请自行修改):

Sub GetNewTxt()
Dim oJs As Object, Str$
Dim Arr, k%
Dim Fso As Object, Fl

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/XM [^↑]+/g,'')}"

Set Fso = CreateObject("Scripting.FileSystemObject")
For Each Fl In Fso.getfolder(App.Path & "\").Files
If Fl.Name Like ".txt" Then
Open Fl For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, "↑"): Reset

Arr = Split(oJs.codeobject.gets(Str), ",")
For k = 0 To UBound(Arr)
Str = Replace(Str, Arr(k), Replace(Arr(k), ";", "↑"))
Next

Str = Replace(Str, "↑", vbCrLf)
Open Fl For Output As #1
Print #1, Str: Reset
End If
Next
End Sub
miforum 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 alzeng 的回复:]
VB code

Sub GetNewTxt()
Dim oJs As Object, Str$
Dim Arr, k%

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/XM……
[/Quote]

多谢楼上各位。
想再请教LS热心大哥,如果某个目录下有很多类似上述abc.txt的文档,想批量解决。我使用您的代码如下:
Sub GetNewTxt()

d = Dir(File1.Path & "\*.txt")
Do While d <> ""


Dim oJs As Object, Str$
Dim Arr, k%

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/XM [^↑]+/g,'')}"

Open File1.Path & "\" & d For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, "↑"): Reset

Arr = Split(oJs.codeobject.gets(Str), ",")
For k = 0 To UBound(Arr)
Str = Replace(Str, Arr(k), Replace(Arr(k), ";", "↑"))
Next

Str = Replace(Str, "↑", vbCrLf)
Open File1.Path & "\" & d For Output As #1
Print #1, Str: Reset



Close #1
d = Dir
Loop


End Sub

Private Sub Command1_Click()
Call GetNewTxt
End Sub

会出现以下错误:
实时错误'94'
无效使用 null

能帮我看看么?再次感谢!

miforum 2010-10-14
  • 打赏
  • 举报
回复
多谢楼上回复。。能实现就行。
skylinecn 2010-10-14
  • 打赏
  • 举报
回复
不是用正则的要嘛?
miforum 2010-10-14
  • 打赏
  • 举报
回复
编辑器有问题。


希望得到的结果是:

SF A
XM 张三
李四
王五
DZ 广东省广州市天河区
SR 低保
LX 老年人;青年人;尚未成年;老年;中年
ED

SF B
XM 程真
欧阳晓兰
DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人
ED

SF A
XM 吴晓光
DZ 广东省珠海市香洲区吉大
SR 离退休
LX 老年人;中年人;残疾
ED

SF C
XM 张德良
DZ 广东省中山市五桂山镇
SR 工作中
LX 老年人
ED
a3333621 2010-10-14
  • 打赏
  • 举报
回复
不知道啊

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧