刚学VB两个星期,就被老板派了任务。这两天实在搞得焦头烂额,请大家帮忙!for example:
打开一个文本文档,
....
Boundary Scan Disables  ON;
Ground Bounce Suppression  OFF;CAPACITOR
  C1         1.47u    10    10 f;
  C2         1.47u    10    10 f;
  C3         1.47u    10    10 f;
  C4         1.47u    10    10 f;INDUCTOR
  FL1           1m    10    10       1 f;
  FL2           1m    10    10       1 f;
  FL3           1m    10    10       1 f;
...当我查找CAPACITOR时,能统计一下CAPACITOR下面的电容个数,比如现在就是4个。
当我查找INDUCTOR时,能统计一下INDUCTOR下面的电感个数,比如现在就是3个。万分感谢各位!最好能把代码上来

解决方案 »

  1.   

    规律性这么强的话,可以这么做,把文本文档保存在d:\1.txt,然后写这段代码,如果规律改变的话,可以加多些数字的判断进去,应该不难。在我电脑调试过了,你那些数据复制进文本文件中刚好在第三个字符,所以用mid(a,3,1)如果是第二个可以用mid(a,2,1)。
    Private Sub Command1_Click()
    Dim a As String
    Dim b As Integer
    Open "d:\1.txt" For Input As #1
    Do While Not EOF(1)
    Line Input #1, a
    If Mid(a, 3, 1) = "C" Then b = b + 1
    If Mid(a, 3, 1) = "F" Then c = c + 1
    Loop
    Close #1
    MsgBox "电容有" & b & "个," & "电感有" & c & "个。"
    End Sub
      

  2.   

    源文件很长啊,因为这是PCB板的转化过来的文件
    命名不一定是最上面1234的哪种规则。
    不过我只需要统计一下各种器件的数量就可以啦。
    在CAP下每行代表一个器件。
    我现在把文件按行转化成一个字符串数组,再去比较但是就不会了。多谢各位!!!以下是部分源文件:
    GLOBAL OPTIONS
      Fixture Type    EXPRESS;
      Fixture Size    BANK2;
      Top Probes Allowed  OFF;
      Heavy Probe Force      8;
      Light Probe Force      4;
      Mechanical Density Threshold    800;
      Vacuum Density Threshold    104;
      Autofile 4094;
      Test Strategy COMBINATIONAL;
      WireWrapping AUTO;
      Metric Units OFF;
      Common Lead Resistance      0.5;    ! (ohms) from probe to component.
      Common Lead Inductance       1u;    ! (Henries) from probe to component.
      Capacitance Compensation ON;
      ........CAPACITOR
      C1           10n    80    20 f PN"0160-3847" "CAP .01U";
      C2           10n    80    20 f PN"0160-3847" "CAP .01U";
      C2H2        100n    10    10 f PN"0160-3847" "CAP .1U";
      C2L2        100p    10    10 f PN"0160-3844" "CAP 100p";
      C3           10n    80    20 f PN"0160-3847" "CAP .01U";
      C4           10n    80    20 f PN"0160-3847" "CAP .01U";
      C5           10n    80    20 f PN"0160-3847" "CAP .01U";
      C6           10n    80    20 f PN"0160-3847" "CAP .01U";
      c7            1u    10    10 f AUTO PN"0810-0296";
      C201         10n    80    20 f PN"0160-3847" "CAP .01U";
      C202         10n    80    20 f PN"0160-3847" "CAP .01U";
      C203         10n    80    20 f PN"0160-3847" "CAP .01U";CONNECTOR
      J1        PN"1200-0446" TJ AUTO "Conn. 16_Pin";PIN LIBRARY
      RP1       PN"1910-0033" "Rpack 33";
      RP2       PN"1910-0033" "Rpack 33";
      RP3       PN"1910-0033" "Rpack 33";
      RP4       PN"1910-0033" "Rpack 33";
      RP5       PN"1910-0033" "Rpack 33";
      RP6       PN"1910-1000" "Rpack 1K";
      SW1       NT PN"1234-4321" "FLTSW 16-pin";
      SW2       NT PN"1234-4321" "FLTSW 16-pin";
      SW3       NT PN"7777-8888" "FLTSW 8-pin";
      SW4       NT PN"7777-8888" "FLTSW 8-pin";
      SW5       NT PN"7777-8888" "FLTSW 8-pin";
      U1        PN"74ACT00" TJ LIB AUTO "Nand_4";
      U2        PN"74F244" TJ LIB AUTO "Buffer";
      U3        PN"74F244" TJ LIB AUTO "Buffer";
      U4        PN"74LS173" TJ LIB AUTO "Latch_4";
      U5        PN"74LS173" TJ LIB AUTO "Latch_4";
      U6        PN"74F244" TJ LIB AUTO "Buffer";
      Y1        PN"1813-0616" "20MHz OSC";RESISTOR
      R1            1k    10    10 f PN"0757-0280" "Res. 1K";
      R2            1k    10    10 f PN"0757-0280" "Res. 1K";
      R2H2       12.1k     1     1 f PN"0757-0280" "Res 12.1k";
      R2H4       12.1k     1     1 f PN"0757-0280" "Res 12.1k";
      R2L2        7.6k     1     1 f PN"0757-0280" "Res 7.6k";
      R2L4        7.6k     1     1 f PN"0757-0280" "Res 7.6k";
      R3            1k    10    10 f PN"0757-0280" "Res. 1K";
      R4            1k    10    10 f PN"0757-0280" "Res. 1K";
      R5            1k    10    10 f PN"0757-0280" "Res. 1K";
      R6            10    10    10 f PN"0757-0346" "Res. 10";
      R7            10    10    10 f PN"0757-0346" "Res. 10";
      R8           10k    10    10 f PN"0757-0442" "Res 10K";
      R201        5.1k    10    10 f PN"0757-0499" "Res 5.1k";
      R202         10k    10    10 f PN"0757-0442" "Res 10K";
      
      

  3.   

    你的文件有多大,如果真的很大的话比如几十百把兆就用数据库吧,
    如果上G的就用大型数据库。
    如果数据量在64K以上,用XML也是很方便的,当然数据格式也要改成XML的格式如果是非常小的可以用 InStr 函数搜索字符串,
    而且你的文件格式最好也改改,方便查找。
    比如:
    .... 
    [$ATTRIB]
    BCD = ON  //Boundary Scan Disables
    GBS = OFF //Ground Bounce Suppression[$CAPACITOR]
    Capacitor = "C1","1.47u","10","10","f"
    Capacitor = "C2","1.47u","10","10","f"
    Capacitor = "C3","1.47u","10","10","f"
    Capacitor = "C4","1.47u","10","10","f"[$INDUCTOR]
    Inductor = "FL1","1m","10","10","1","f" 
    Inductor = "FL2","1m","10","10","1","f" 
    Inductor = "FL3","1m","10","10","1","f"  
    ....
    比如你把文本读到一个字符串变量里:Dim TextInfo As String, LineText As String, IsOneLine As Long
    IsOneLine = 0
    Open "C:\1.txt" For Input As #1
    Do While Not EOF(1)
       Line Input#1, LineText
       LineText = Trim(LineText)   '将前后多余的空格符去掉
       '判断不是空行就加入数据中
       If Len(LineText) > 0 Then
          If IsOneLine = 0 Then
             TextInfo = LineText
             IsOneLine = 1
          Else
             TextInfo = TextInfo & vbCrLf & LineText
          End If
       End If
    Loop
    Close #1然后你可以用InStr查找所需的段落:Dim SLong As Long, ELong As Long, ParagraphStr As String
    Dim StrArray() As String, SearchParagraph As String
    SearchParagraph = "[$CAPACITOR]"
    '找到段落的开头
    SLong = InStr(1, TextInfo, SearchParagraph, vbTextCompare)
    '找到段落的结尾
    ELong = InStr(SLong + 1, TextInfo, "[$", vbTextCompare)
    If ELong = 0 Then
        ParagraphStr = Right(TextInfo, Len(TextInfo) - SLong)
    Else
        '提取出段落全部内容
        ParagraphStr = Mid(TextInfo, SLong, ELong - SLong - 1)
    End If
    '这时ParagraphStr的内容因该是:
    '[$CAPACITOR]
    'Capacitor = "C1","1.47u","10","10","f"
    'Capacitor = "C2","1.47u","10","10","f"
    'Capacitor = "C3","1.47u","10","10","f"
    'Capacitor = "C4","1.47u","10","10","f"'将提取出的内容以行为单位分割成字符串数组
    StrArray = Split(ParagraphStr, vbCrLf)
    MsgBox SearchParagraph & "的个数是" & UBound(StrArray) & "个"
    方法大概是这样,要处理比如"//"的话可以在读取文件时处理掉的,用Split+For处理比较简单
    其实处理文本VB算是非常好用的了,起码在类型和编码上不用去考虑太多,如果是VC处理起来就
    麻烦多了。VB的数组概念也是很方便的,好好利用这些函数其实很容易处理的。
    你最好学好这些常用函数,对文本的处理很有用的:
    InStr
    Mid
    Left
    Right
    Len
    Split
    LTrim
    RTrim
    Trim
    UCase
    LCase
    StrConv
    String
    Format
      

  4.   

    如果你的格式可以用INI处理的话,改成INI文件用API来处理也可以的
      

  5.   

    哦。谢谢各位了。特别是SupermanKing!!!下班时走得急了,又还不怎么懂得玩这个东西。见谅见谅!
    我只能口头给你们结分了,不过估计你们也不稀罕,呵呵
    各位都是100分,不过SupermanKing,正如你的名字样,再100分前面再加个super.