有 一 大 文 件 不以 c:111.txt,大 于 500K,内 有 数 据 如 下
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
7a 8b 5d 17c 9d**
7a 8b 5d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c**
...
...
... 里 面 有 3a 4d** ; 7a 8b 9d** ;7a 8b 5d 17c 9d** ;7a 8b 5d 17c**;这 几 种 格 式 的 数 据
我 想 取 出 其 中 只 有 7a 8b 5d 17c 9d** 格 式 的 行 (7a 8b 5d 17c 9d**不 是 固 定 的 也 可 能 是 99a 18b 15d 17c 9d**)
并 且 这 样 的 行 至 少 包 括 有 一 个 3a 4d** 这 样 格 式 的 行 .如 :
3a 4b** 11b 12d** 7a 8b 5d 17c 9d** ok
7a 8b 5d 17c 9d** x
7a 8b 5d** x
3c 4d** 7b 8c 5d 17c 9d** 8a 9c** ok
3d 4b** 7b 8b 5d 17c 9d** ok
7c 8a 5d 17c 9d** 8a 9c** ok
...
...
...
打 OK的 行 为 合 格 ,其 它 则 不 需 要 ,然 后 合 格 的 行 则 保 存 在 d:222.txt中 ,一 行 行 的 保 存
这 是 第 一 步 .第 2步 为 查 找 .
例 子
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
7a 8b 5d 17c 9d**
7a 8b 5d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c** 我 要 查 找 例 子 中 有 3a 4b** 的 行 .取 出 所 有 并 保 存 在 d:333.txt中
对特 别 注 意 的 是 3a 4b** 也 可 是以 3c 4d** 3b 4a** 3a 4c** 就 是 说 只 要 有 3 4 而 不 管 3 4 后 面 的 字 符 是 什 么
都 符 合 条 件 .
第 2步 我 给 出 的 只 是 个 例 子 .实 际 中 应 该 是 查 找 第 一 步 中 保 存 在 d:222.txt中 的 所 有 数 据 ,而 且 3a 4b**
不 是 固 定 的 也 可 以 是 4b 7d** 或 6d 7c**或 其 它 任 意 , 但 必 须 是 2个 字 符 组 成 如 2c 8b** ; 5d 8b** ; 9c 7d**等
注 意 只 能 是 这 样 格 式 的 , 不 能 从 3c 4d 5b 6d 7c**这 种 格 式 里 查 找 。
最 后 查 找 出 来 的 结 果 应 为 :
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
...
...
...
然 后 把 所 有 符 合 要 求 的 行 保 存 在 d:333.txt中
而 且 要 求 查 找 的 3a 4b**改 为 5c 6d**也 行 。 暂 时 就 这 么 多 。 我 不 清 楚 是 用 数 据 库 来 做 还 是 用 文 件 做 好 。 因 为 数 据 库 我 懂 得 实 在 太 少 。
分 不 够 可 以 再 加 , 有 什 么 其 它 需 要 也 可 以 跟 我 谈 , 最 好 有 程 序 。 谢 了 。
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
7a 8b 5d 17c 9d**
7a 8b 5d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c**
...
...
... 里 面 有 3a 4d** ; 7a 8b 9d** ;7a 8b 5d 17c 9d** ;7a 8b 5d 17c**;这 几 种 格 式 的 数 据
我 想 取 出 其 中 只 有 7a 8b 5d 17c 9d** 格 式 的 行 (7a 8b 5d 17c 9d**不 是 固 定 的 也 可 能 是 99a 18b 15d 17c 9d**)
并 且 这 样 的 行 至 少 包 括 有 一 个 3a 4d** 这 样 格 式 的 行 .如 :
3a 4b** 11b 12d** 7a 8b 5d 17c 9d** ok
7a 8b 5d 17c 9d** x
7a 8b 5d** x
3c 4d** 7b 8c 5d 17c 9d** 8a 9c** ok
3d 4b** 7b 8b 5d 17c 9d** ok
7c 8a 5d 17c 9d** 8a 9c** ok
...
...
...
打 OK的 行 为 合 格 ,其 它 则 不 需 要 ,然 后 合 格 的 行 则 保 存 在 d:222.txt中 ,一 行 行 的 保 存
这 是 第 一 步 .第 2步 为 查 找 .
例 子
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
7a 8b 5d 17c 9d**
7a 8b 5d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c** 我 要 查 找 例 子 中 有 3a 4b** 的 行 .取 出 所 有 并 保 存 在 d:333.txt中
对特 别 注 意 的 是 3a 4b** 也 可 是以 3c 4d** 3b 4a** 3a 4c** 就 是 说 只 要 有 3 4 而 不 管 3 4 后 面 的 字 符 是 什 么
都 符 合 条 件 .
第 2步 我 给 出 的 只 是 个 例 子 .实 际 中 应 该 是 查 找 第 一 步 中 保 存 在 d:222.txt中 的 所 有 数 据 ,而 且 3a 4b**
不 是 固 定 的 也 可 以 是 4b 7d** 或 6d 7c**或 其 它 任 意 , 但 必 须 是 2个 字 符 组 成 如 2c 8b** ; 5d 8b** ; 9c 7d**等
注 意 只 能 是 这 样 格 式 的 , 不 能 从 3c 4d 5b 6d 7c**这 种 格 式 里 查 找 。
最 后 查 找 出 来 的 结 果 应 为 :
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
...
...
...
然 后 把 所 有 符 合 要 求 的 行 保 存 在 d:333.txt中
而 且 要 求 查 找 的 3a 4b**改 为 5c 6d**也 行 。 暂 时 就 这 么 多 。 我 不 清 楚 是 用 数 据 库 来 做 还 是 用 文 件 做 好 。 因 为 数 据 库 我 懂 得 实 在 太 少 。
分 不 够 可 以 再 加 , 有 什 么 其 它 需 要 也 可 以 跟 我 谈 , 最 好 有 程 序 。 谢 了 。
3a 4b** 11b 12d** 7a 8b 5d 17c 9d** ok
7a 8b 5d 17c 9d** x
7a 8b 5d** x
3c 4d** 7b 8c 5d 17c 9d** 8a 9c** ok
3d 4b** 7b 8b 5d 17c 9d** ok
7c 8a 5d 17c 9d** 8a 9c** ok
...
...
...
打 OK的 符 合 条 件 第 二 个 条 件 的 "xx xx**"为 特 定 的 .是 我 输 入 一 个 需 要 查 找 的 "xx xx**如 3a 4b**然 后 从 222.txt中 找 出 所 有
3a 4b** 其 中 a b不 是 固 定 的 ,可 以 是 3b 4d** 或 者 3 c 4 c** 但 3 4 一 定 要 相 同 ,然 后 应 该 以
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
...
...
...
这 样 的 格 式 查 找 出 来 .
好 像 第 一 个 条 件 也 有 点 多 佘 ,不 要 也 行 ,主 要 是 为 了 说 得 更 清 楚 一 些 .关 键 是 第 二 步 .
Option ExplicitFunction TestStr(ByVal s As String) As Boolean
'你的要求:找到至少包含一个"XX XX**"这种格式字符串的行
'我的理解:数字+字符+空格+数字+字符+**
'本来可以用like判断,只是不知道你数字有几位,所以用了Replace过滤
Dim i As Integer
If UBound(Split(s, Chr(32))) = 1 Then '包含一个空格
For i = 0 To 9
s = Replace(s, i, "")
Next
s = Replace(s, Chr(32), "")
If Len(s) = 2 Then TestStr = True '过滤掉数字和空格还有二个字符
End If
End FunctionPrivate Sub Command1_Click()
Dim h As Long
Dim sFile As String
Dim sLine() As String
Dim sTmp() As String
Dim i As Long, j As Long
h = FreeFile
Open "D:\test.txt" For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close
sLine = Split(Trim(sFile), vbCrLf) '分行
h = FreeFile
Open "d:\test2.txt" For Output As h
For i = 0 To UBound(sLine)
sTmp = Split(Trim(sLine(i)), "**") '按**分组
j = UBound(sTmp)
Do While j > 0
If TestStr(Trim(sTmp(j))) Then
Print #h, sLine(i)
Exit Do
End If
j = j - 1
Loop
Next
Close
End Sub第一个就这个样吧?第二个思路也差不多吧?现在没空写了.......
3a 4d** 只 有 2个 数 据
7a 8b 9d** 有 三 个 数 据
7a 8b 5d 17c 9d** 有 五 个 数 据
7a 8b 5d 17c** 有 4个 数 据
第 一 个 条 件 就 是 说 到查 找 一 个 有 五 个 数 据 的 行 ,并 且 这 行 至 少 有 一 个 2 个 数 据
如 7a 8b 5d 17c 9d** 3a 4d**
也 可 以 有 2个 以 上 的 2个 数 据 如 3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
注 **不 是 数 据 只 是 一 种 分 翮 数 据 数 据 的 符 号
以 下 几 种 都 打 OK的 为 符 合 条 件 的
3a 4b** 11b 12d** 7a 8b 5d 17c 9d** ok
7a 8b 5d 17c 9d** x
7a 8b 5d** x
3c 4d** 7b 8c 5d 17c 9d** 8a 9c** ok
3d 4b** 7b 8b 5d 17c 9d** ok
7c 8a 5d 17c 9d** 8a 9c** ok
现 在 就 差 第 2步 了 .
Option ExplicitFunction TestStr1(ByVal s As String) As Boolean
'你的要求:找到至少包含一个"XX XX**"这种格式字符串的行
'我的理解:数字+字符+空格+数字+字符+**
'本来可以用like判断,只是不知道你数字有几位,所以用了Replace过滤
Dim i As Integer
If UBound(Split(s, Chr(32))) = 1 Then '包含一个空格
For i = 0 To 9
s = Replace(s, i, "")
Next
s = Replace(s, Chr(32), "")
If Len(s) = 2 Then TestStr1 = True '过滤掉数字和空格还有二个字符
End If
End FunctionFunction TestStr2(ByVal s As String) As Boolean
'你的要求:找 一 个 有 五 个 数 据 的 行
Dim i As Integer
If UBound(Split(s, Chr(32))) = 4 Then
For i = 0 To 9
s = Replace(s, i, "")
Next
s = Replace(s, Chr(32), "")
If Len(s) = 5 Then TestStr2 = True '过滤掉数字和空格还有5个字符
End If
End FunctionPrivate Sub Command1_Click()
Dim h As Long
Dim sFile As String
Dim sLine() As String
Dim sTmp() As String
Dim i As Long, j As Long
Dim b(1) As Boolean
h = FreeFile
Open "D:\test.txt" For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close
sLine = Split(Trim(sFile), vbCrLf) '分行
h = FreeFile
Open "d:\test2.txt" For Output As h
For i = 0 To UBound(sLine)
b(0) = False: b(1) = False
sTmp = Split(Trim(sLine(i)), "**") '按**分组
j = UBound(sTmp)
Do While j >= 0
If TestStr1(Trim(sTmp(j))) Then b(0) = True
If TestStr2(Trim(sTmp(j))) Then b(1) = True
If b(0) = True And b(1) = True Then
Print #h, sLine(i)
Exit Do
End If
j = j - 1
Loop
Next
Close
End Sub测试数据:
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
7a 8b 5d 17c 9d**
7a 8b 5d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c**
7c 8a** 结果:
3a 4b** 11b 12d** 7a 8b 5d 17c 9d**
3c 4d** 7b 8c 5d 17c 9d** 8a 9c**
3d 4b** 7b 8b 5d 17c 9d**
7c 8a 5d 17c 9d** 8a 9c** 第二个道理一样
Option ExplicitPrivate Function GetText(ByVal InFileName As String, ByVal OutFileName As String, ByVal SearchStr As String) As Long
'从A文件里找到符合条件的行,写到B文件里去
'InFileName - 源文件
'OutFileName - 目标文件
'SearchStr - 要查找的字符串
'返回值:
' 写入到目标文件中的行数
Dim lOutLine As Long, Buff As String, StrLine() As String, SearchStrLen As Long
Dim I As Long, J As Long, bAddStr As Boolean
SearchStrLen = Len(SearchStr) '关键字长度
lOutLine = 0
GetText = 0
Open InFileName For Binary As #1 '一次性读入文本到内存
Buff = String(LOF(1), Chr(0))
Get 1, , Buff
Close #1
StrLine = Split(Buff, vbCrLf) '按行分割
Open OutFileName For Binary As #2 '写回文件
For I = 0 To UBound(StrLine)
bAddStr = False
J = InStr(1, StrLine(I), SearchStr) '一行一行地找
If J > 0 Then '先确认是否包含要查找的字符串,再确认字符串出现的条件是否符合
If J = 1 Then '如果是在行首找到的,那就肯定符合,通过.
bAddStr = True
ElseIf Mid(StrLine(I), J - SearchStrLen, SearchStrLen) = "** " Then '如果不是行首,就判断其前面三个字符
bAddStr = True
End If
If bAddStr = True Then
Put 2, , StrLine(I) & vbCrLf '符合条件就写到目标文件里去.
lOutLine = lOutLine + 1 '记录行数
End If
End If
Next
Close #2
GetText = lOutLine
End FunctionPrivate Sub Command1_Click()
Debug.Print GetText("d:\temp\1.txt", "D:\temp\2.txt", "3a 4b**")
End Sub感觉把"** "这个前缀也做成参数应该能适应更多的工作方式.就是不知道要的是不是这种效果,解说得有些让人不是很明白.
'这里搞错了.我是脑袋里在想着把那个**加空格做成参数,于是就可以用这个变量....汗.
'应该改成如下:
ElseIf Mid(StrLine(I), J - 3, 3) = "** " Then '如果不是行首,就判断其前面三个字符
'这里的3就是那个前缀的长度.....
'函数首部的这一句:
SearchStrLen = Len(SearchStr) '关键字长度
'无作用了.....汗.
'在设计程序时,将以下设置好。设计时才有效。不能在运行时设置。
'Text1.MultiLine = true
'Text2.MultiLine = true
'Text1.ScrollBars = 3
'Text2.ScrollBars = 3Option ExplicitDim TXTline$() '取得一行数据并放到数组中
Dim FileNumber&, i%, j%, LineIndex#
Dim cTXTValue$, S1$, S2$, S3$
Private Sub Command1_Click()
Text1.Text = ""
Text2.Text = ""
If Dir("c:\111.txt") <> "" Then SeekWord ("c:\111.txt")
End SubPrivate Sub Command2_Click()
Text2.Text = ""
If Text1.Text <> "" Then ReplaceWord
End SubPrivate Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
'LineIndex = 0
Command1.Caption = "开始"
Command2.Caption = "替换"
End Sub
'查找TXT文件中包含特定字符9d**或者9D**的行
'并且行至少包含一个NL NL**的行,N代表数字,L代表字母。N可以是1位数或2位数及以上
Private Function SeekWord(cFile As String) As Boolean
Dim ID$, ID9d$ '标识符
Dim PO1%, PO2%
Dim SubLine$() '子数组
ID = "**": ID9d = "9d**" '标识符
LineIndex = 0
'i = 0
FileNumber = FreeFile
Open (cFile) For Input As #FileNumber '打开文件
Do While Not EOF(FileNumber)
Line Input #FileNumber, cTXTValue '读取一行文本
cTXTValue = Trim(cTXTValue)
PO1 = InStr(1, cTXTValue, LCase(ID9d)) '包含9d**的行
PO2 = InStr(1, cTXTValue, UCase(ID9d)) '包含9D**的行
If (Len(cTXTValue) <> 0) And (PO1 > 0 Or PO2 > 0) Then '不是空行,且包含9d**或者9D**
TXTline() = Split(cTXTValue, "**") '将一行拆分到数组中
For i = 0 To UBound(TXTline)
TXTline(i) = Trim(TXTline(i))
S1 = TXTline(i)
If Right(S1, 2) = "9d" Or Right(S1, 2) = "9D" Then GoTo cjl
'If Len(S1) <> 5 Then GoTo cjl
'S2 = Mid(S1, 1, 1): S3 = Mid(S1, 4, 1)
'If IsNumeric(S2) = True And IsNumeric(S3) = True Then '判断1、4位是否为数字
' S2 = Mid(S1, 2, 1): S3 = Mid(S1, 5, 1)
' If IsLetter(S2) = True And IsLetter(S3) = True Then '判断2、5位是否为字母
' Text1.Text = Text1.Text & cTXTValue & vbCrLf '符合条件行的加入文本框Text1
' LineIndex = LineIndex + 1
' Label1.Caption = "已添加:" & LineIndex & "行"
' Exit For
' End If
'End If
SubLine() = Split(S1, " ")
For j = 0 To UBound(SubLine)
If UBound(SubLine) < 2 Then '规定只有2个元素,如:12c 3d**
SubLine(j) = Trim(SubLine(j))
S1 = SubLine(j)
S2 = Mid(S1, 1, Len(S1) - 1): S3 = Right(S1, 1)
If IsNumeric(S2) = True And IsLetter(S3) = True Then '判断是否前面数字,后面字母,如:12c 3d**
S1 = SubLine(j + 1)
S2 = Mid(S1, 1, Len(S1) - 1): S3 = Right(S1, 1)
If IsNumeric(S2) = True And IsLetter(S3) = True Then '判断是否前面数字,后面字母,如:12c 3d**
Text1.Text = Text1.Text & cTXTValue & vbCrLf '符合条件行的加入文本框Text1
LineIndex = LineIndex + 1
Label1.Caption = "已添加:" & LineIndex & "行"
Exit For
End If
End If
End If
Next
cjl:
Next
End If
DoEvents
Loop
Close #FileNumber
Text1.Text = Text1.Text & vbCrLf
TXTline() = Split(Text1.Text, vbCrLf)
If Dir("c:\222.txt") <> "" Then Kill ("c:\222.txt")
FileNumber = FreeFile
Open ("c:\222.txt") For Output Shared As #FileNumber '打开文件,准备保存
For i = 0 To UBound(TXTline)
If Len(TXTline(i)) <> 0 Then Print #FileNumber, Trim(TXTline(i))
DoEvents
Next
Close #FileNumber
Beep
End Function'查找的3a 4b**改为5c 6d**
'7c 8a 5d 17c 9d** 8a 9c**也应该符合第二个条件吧
Private Sub ReplaceWord()
LineIndex = 0
For i = 0 To UBound(TXTline)
TXTline(i) = Trim(TXTline(i))
If Len(TXTline(i)) <> 0 Then
j = InStr(1, TXTline(i), "3a 4b**")
If j > 0 Then
Mid(TXTline(i), j, Len("3a 4b**")) = "5c 6d**"
LineIndex = LineIndex + 1
Label2.Caption = "已更改:" & LineIndex & "行"
End If
Text2.Text = Text2.Text & TXTline(i) & vbCrLf
End If
DoEvents
Next
If Dir("c:\333.txt") <> "" Then Kill ("c:\333.txt")
FileNumber = FreeFile
Open ("c:\333.txt") For Output Shared As #FileNumber '打开文件,准备保存
For i = 0 To UBound(TXTline)
If Len(TXTline(i)) <> 0 Then Print #FileNumber, Trim(TXTline(i))
Next
Close #FileNumber
End Sub
'判断一个字符串是否全为字母
Private Function IsLetter(lstr As String) As Boolean
Dim lstrlen%, i%, S$
If Len(lstr) = 0 Then Exit Function
IsLetter = True
lstrlen = Len(lstr)
For i = 1 To lstrlen
S = Mid(lstr, i, 1)
If Not ((Asc(S) > 64 And Asc(S) < 91) Or (Asc(S) > 96 And Asc(S) < 123)) Then
IsLetter = False
Exit Function
End If
Next
End Function
测试的结果还不错!!
chenji1031 ni xi ku le
wo wu bi huai le ,da bu zhi lai ,bu hao yi si