当前位置: 代码迷 >> VB >> 不规则文件内容身份证号码提取解决思路
  详细解决方案

不规则文件内容身份证号码提取解决思路

热度:226   发布时间:2016-05-19 04:22:30.0
不规则文件内容身份证号码提取
文件内容每行都有一个或多个身份证号码信息
而且内容格式不规则

"0100000000002013030003","姓名","","1","1963/10/13","1963/10/13","37062019631013301X","110108","地址地址在地址地址地址","110108",
"120104197801086036","0201000009992012060001","姓名","","","1","1978/01/08","1978/01/08","110106","地址地址在地址地址地址","11",
37062019631013301X
"110103197912110686","372924197403010316"
511111196803261013
510321197711148336
41272219700612874X
“410305690215031”
.........
内容将近比较多几十万行数据
前面已经做过很多测试,文件读取速率跟文件大小没有关系,不用考虑文件有多少M
文件内容中有15位跟18位的身份号码,还有一些不相干的数字字符串
如何能高效的提取出身份号码信息?


------解决方案--------------------
把前个帖子中的方法改一下,支持无双引号的
Function GetID(sLine As String) As String
    Dim lLength     As Long
    Dim i1          As Long    '字段开始位置'
    Dim i2          As Long    '字段结束的逗号位置'
    Dim lQuote1     As Long    '{1,0}:有无左双引号'
    Dim lQuote2     As Long    '{1,0}:有无右双引号'
    Dim s           As String

    lLength = Len(sLine)
    If lLength = 0 Then Exit Function

    i1 = 1
    While i1 <= lLength
        i2 = InStr(i1, sLine, ",")
        If i2 = 0 Then i2 = lLength + 1

        lQuote1 = IIf(Mid$(sLine, i1, 1) = """", 1, 0)
        lQuote2 = IIf(Mid$(sLine, i2 - 1, 1) = """", 1, 0)
        If lQuote1 <> lQuote2 Then GoTo NextField '双引号配对,不要求就去掉'

        Select Case (i2 - i1 - lQuote1 - lQuote2)
            Case 15
                s = Mid$(sLine, i1 + lQuote1, 15)
                If s Like "###############" Then
                    GetID = s
                    Exit Function
                End If
            Case 18
                s = Mid$(sLine, i1 + lQuote1, 18)
                If s Like "#################[0-9X]" Then
                    GetID = s
                    Exit Function
                End If

        End Select

NextField:
        i1 = i2 + 1
    Wend
End Function

------解决方案--------------------
楼主试试这个。
你给我的样本中,有中文绰号的,是不是输入失误啊?这个我没进行处理。
Option Explicit

Private Sub Command1_Click()
   Const NUM_REG18 As String = "#################[0-9X]"
   Const NUM_REG15 As String = "###############"
      Dim strRlt() As String
      Dim strText As String
      Dim strTemp As String
      Dim dTime   As Double
      Dim lNum    As Long
      Dim lTxtL   As Long
      Dim iFn     As Integer
      Dim i&, p&, ps&, pe&

   iFn = FreeFile()
   dTime = Timer()
   Open "E:\Tools\11.txt" For Input As #iFn
   For i = 1 To 300
      Line Input #iFn, strText
   Next
   lNum = LOF(iFn) / (Seek(iFn) / 320&)
  相关解决方案
本站暂不开放注册!
内测阶段只得通过邀请码进行注册!
 
  • 最近登录:Sun Oct 22 03:18:51 CST 2017
  • 最近登录:Sun Oct 22 03:18:51 CST 2017
  • 最近登录:Sun Oct 22 03:18:51 CST 2017
  • 最近登录:Sun Oct 22 03:18:51 CST 2017
  • 最近登录:Sun Oct 22 03:18:51 CST 2017