Announcement

Collapse
No announcement yet.

Parsing...

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Scott Turchin
    replied
    Or if you know it's the last entry:

    sTmp = Parse(St,"|",-1) that'll go backwards.

    Cheap but it works.

    Leave a comment:


  • StanHelton
    replied
    Here's a quick & dirty test of your problem as I understand it. I've tested 2 variations on the PARSE$ function and both of them work as advertised.

    Reviewing your code I found this line:

    Code:
    IF MID$(lRec$,1,3)="REM" THEN ITERATE DO
    This implies a more complex structure in your data file than indicated. My best guess is that your field delimiters are not consistent in the data file. As a solution, I suggest programatically checking for and inserting the necessary field delimiters before you do any processing of the individual records, including the exit sequence where I found this line of code.

    Or, even better, ensuring that your program accounts for all the necessary variations in the data file as well as the most common errors you are likely to encounter in the data file.

    Code:
    #COMPILE EXE
    #DIM ALL
    
    FUNCTION PBMAIN () AS LONG
        LOCAL tempString AS STRING
        LOCAL DataFile AS INTEGER
        LOCAL i AS LONG
        
        LOCAL lRec$     'your variable
        
        'build array with your data from original post
        DIM DataArray(1 TO 10) AS LOCAL STRING
        ARRAY ASSIGN DataArray() = "SANTOPRENCE GRIP", "W", "NATURAL CORK", "X", "RUBBER CORK COMPOUND", "Y", _
                                   "PINS", "Z", "Test", "AB"
        
        'make a file like your original post
        DataFile = FREEFILE
        OPEN "datafile" FOR OUTPUT AS #DataFile
        FOR i = 1 TO 10 STEP 2
            tempString = DataArray(i) & "|" & DataArray(i + 1)
            PRINT #DataFile, tempString
        NEXT i
        CLOSE #DataFile
        
        'display as from your original post
        DataFile = FREEFILE
        OPEN "datafile" FOR INPUT AS #DataFile
        FOR i = 1 TO 5
            LINE INPUT #DataFile, lRec$
            MSGBOX UCASE$(TRIM$(PARSE$(lRec$,"|",2)))   'your code line from original post
        NEXT i
        CLOSE #DataFile
        
        'add a delimiter to your input data and display
        DataFile = FREEFILE
        OPEN "datafile" FOR INPUT AS #DataFile
        FOR i = 1 TO 5
            LINE INPUT #DataFile, lRec$
            lRec$ = lRec$ & "|"         'add a delimiter to the end of your input data
            MSGBOX UCASE$(TRIM$(PARSE$(lRec$, "|", 2)))     'your code line from original post
        NEXT i
        CLOSE #DataFile
        
        MSGBOX "Basic Test is complete", %MB_TASKMODAL OR %MB_ICONINFORMATION
    END FUNCTION
    Stan

    Leave a comment:


  • Michael Mattias
    replied
    Code:
    #TOOLS ON 
    
    FUNCTION WinMain 
       TRACE NEW   "tracefile.txt" 
       CALL main_thing
       TRACE CLOSE  
    
    SUB FetchComponentID
        TRACE ON 
    
    
        LINE INPUT #1,lRec$
        TRACE PRINT "Raw Lrec$ =" & lrec$
         
        .....
        a$ = PARSE$(lRec$,"|",2)
        a$ = UCASE$(TRIM$(a$))
        b$= EZ_GetText ("SCAN",%SCAN_ORDERNO)
        b$ = MID$(B$, 14,2) 
        TRACE PRINT USING$ ("A$ '&'   B$ '&'", A$, B$) 
        IF B$ = A$ THEN ....
           TRACE PRINT "Equals" 
    
        ELSE
           TRACE PRINT "Not equals" 
    
    
        TRACE OFF 
    END SUB
    Tune, tweak as required.

    Post relevant portions of tracefile.txt if problem does not leap off page at you.





    MCM

    Leave a comment:


  • Gafny Jacob
    replied
    Check that last line in the file end with CRLF

    Leave a comment:


  • Gösta H. Lovgren-2
    replied
    Katherine,

    I tried running your code
    '
    Code:
    'PBWIN 9.00 - WinApi 05/2008 - XP Pro SP3
    #Compile Exe                                
    #Dim All 
    #Include "WIN32API.INC"
    #Include "COMDLG32.INC"
    Function PBMain
         Call FetchComponentID
        Local x&
        x = MsgBox ("Testing Katherine", %MB_YESNO, "Click Yes")
    End Function
    Sub FetchComponentID
    Close #1
    Local lRec$
    Open "M:\Scanners\components.ini" For Input Lock Shared As #1
    If Err Then
    MsgBox Str$(Err)+" "+Error$+$Lf+"Openning M:\Scanners\components.ini"
    Exit Sub
    End If
    If Lof(1)=0 Then
    gAns&=EZ_MsgBox("SCAN","No Component Items Exist","Shop Floor Bill Of Material","OK")
    SQL_ShutDown
    EZ_UnLoadForm "SCAN"
    End If
    Do While Not Eof(1)
    Line Input #1,lRec$
    If Mid$(lRec$,1,3)="REM" Then Iterate Do
    lRec$ = Remove$(lRec$, $Nul)
    If UCase$(Trim$(Parse$(lRec$,"|",2)))=Mid$(EZ_GetText ("SCAN",%SCAN_ORDERNO),14,2) Then 'was 14,1
    gItemNo$=UCase$(Trim$(Parse$(lRec$,"|",1)))
    gIDError&=0
    Close #1
    Exit Sub
    End If
    Loop
    gIDError&=1
    Close #1
    End Sub
    '
    but get an "undefined Equate" error for %SCAN_ORDERNO.

    As Michael has suggested, the code would be much easier to understand/follow/debug if the multi-nested function lines(s) were broken down into single functions.

    And when posting code (even snippets), it's much easier to read/follow for the rest of us if the code were enclosed in {code} ... {/code} brackets (using square brackets instead of curlies as shown here).

    And you are posting EZ_Gui based code which won't run without Ex_Gui (and I tried, ... several times).


    That file is used in an above routine. If I don't have that in there, then I get an error stating that the file is open. I have changed it to #2, #3 etc. throughout this sub with the same result.
    To avoid that error use Freefile to get a file number. (Note it indicates an error somewhere else in the code, file getting left open or something)

    I have this line of code:

    MSGBOX UCASE$(TRIM$(PARSE$(lRec$,"|",2)))

    and this is part of the file it's reading:

    SANTOPRENCE GRIP|W
    NATURAL CORK|X
    RUBBER CORK COMPOUND|Y
    PINS|Z
    Test|AB

    When I enter AB, only the A is read. How can I get AB to be read?
    The first 4 lines only contain 1 character after "|", while "test" has 2. Maybe the string being processed (EZ_Gui Textbox?) is actually returning one character less than you expect. (Can't tell, no operable code shown).

    ===================================
    "Being politically correct means
    always having to say you're sorry."
    Anonymous
    ===================================
    Last edited by Gösta H. Lovgren-2; 8 Oct 2008, 10:13 PM.

    Leave a comment:


  • Katherine Lepley
    replied
    That file is used in an above routine. If I don't have that in there, then I get an error stating that the file is open. I have changed it to #2, #3 etc. throughout this sub with the same result.

    On a earlier topic, when I tried the debugging steps Michael put in, a$ returns B, not AB.

    Leave a comment:


  • Michael Mattias
    replied
    Just for style points...

    Code:
    SUB FetchComponentID
       CLOSE #1
    Until today I had never seen a procedure BEGIN with a CLOSE file.

    "IMO*" files should be OPENed and CLOSEd - in that order - within the using procedure.

    If the file is opened in a calling procedure, I'd pass the handle as a parameter to the called support procedures.


    MCM
    *
    "IMO" ==> you may argue.
    "IMNSHO" ===> you may not.

    Leave a comment:


  • Michael Mattias
    replied
    And before anybody whines about it...

    NO, this will NOT slow down your program. This is what the compiler does with all those multi-function statements anyway. So beat the rush.

    Not to mention.. over the years I've had some funny things happen when using multi-function statements, which problems magically disappeared when I broke up the code into a series of "simpler" statements. (your compiler and version not shown).

    Leave a comment:


  • Katherine Lepley
    replied
    Thank you for your advise, Michael, I will try it.

    I wanted to you let you all know that when I changed AB to 1 or 10 or 34, it came up and I could continue on with the program. I don't understand why the letters aren't working. In the meantime, I'm going to use numbers until I can solve the AB issue.

    Leave a comment:


  • Michael Mattias
    replied
    BION, this is a good place for the stepping debugger. (Say what? MCM suggesting the stepping debugger?)

    However, you will only get good value for this if you replace all those multiple function statements, e.g....
    Code:
    IF UCASE$(TRIM$(PARSE$(lRec$,"|",2)))=MID$(EZ_GetText ("SCAN",%SCAN_ORDERNO),14,2) THEN 'was 14,1
    .. with some intermediate variables you can "watch"
    Code:
    a$ = PARSE$(lRec$,"|",2)
    a$ = UCASE$(TRIM$(a$))
    b$= EZ_GetText ("SCAN",%SCAN_ORDERNO)
    b$ = MID$(B$, 14,2) 
    IF B$ = A$ THEN ....
    ....
    Step thru the code line by line watching a$ and b$. If something funny is happening it will show up for you.

    MCM

    Leave a comment:


  • Katherine Lepley
    replied
    Thank you for your help. I have rewritten the .ini, but no luck so far. I will take your suggestion and look through the code again. I think I have looked at it so much, though, that I'm beginning to skip over lines. However, nothing I have tried has worked yet.

    Leave a comment:


  • Scott Slater
    replied
    The problem is then somewhere else. You will have to check the file itself, and all of the I/O functions related to the file.

    Leave a comment:


  • Katherine Lepley
    replied
    No, it didn't. "PULL PLATE|A" is what was listed instead.

    Leave a comment:


  • Scott Slater
    replied
    I would suggest adding:

    Code:
    MSGBOX lRec$,0,"DEBUG"
    Before the line:

    Code:
    IF UCASE$(TRIM$(PARSE$(lRec$,"|",2)))=MID$(EZ_GetText ("SCAN",%SCAN_ORDERNO),14,2) THEN 'was 14,1
    Run the program and see what the debug message box shows you. See if the AB follows the "|" symbol in your string.

    Leave a comment:


  • Katherine Lepley
    replied
    Scott,

    Here is the sub that shows how the data is going into lRec$:

    SUB FetchComponentID
    CLOSE #1
    LOCAL lRec$
    OPEN "M:\Scanners\components.ini" FOR INPUT LOCK SHARED AS #1
    IF ERR THEN
    MSGBOX STR$(ERR)+" "+ERROR$+$LF+"Openning M:\Scanners\components.ini"
    EXIT SUB
    END IF
    IF LOF(1)=0 THEN
    gAns&=EZ_MsgBox("SCAN","No Component Items Exist","Shop Floor Bill Of Material","OK")
    SQL_ShutDown
    EZ_UnLoadForm "SCAN"
    END IF
    DO WHILE NOT EOF(1)
    LINE INPUT #1,lRec$
    IF MID$(lRec$,1,3)="REM" THEN ITERATE DO

    lRec$ = REMOVE$(lRec$, $NUL)

    IF UCASE$(TRIM$(PARSE$(lRec$,"|",2)))=MID$(EZ_GetText("SCAN",%SCAN_ORDERNO),14,2) THEN 'was 14,1
    gItemNo$=UCASE$(TRIM$(PARSE$(lRec$,"|",1)))
    gIDError&=0
    CLOSE #1
    EXIT SUB
    END IF
    LOOP

    gIDError&=1
    CLOSE #1
    END SUB

    Leave a comment:


  • Scott Slater
    replied
    Code:
    #Compile Exe
    #Dim All
     
    Function PBMain () As Long
     
        Local lRec As String
        
        lRec = "Test|AB"
        
        MsgBox UCase$(Trim$(Parse$(lRec,"|",2)))
     
    End Function
    It works if you do it this way, how are you getting your data into lRec$ ? I would check it beforehand to make sure that it prints out "Test|AB".

    Leave a comment:


  • Katherine Lepley
    replied
    Scott

    Thank you for your input.

    I looked and retyped and there are no null characters between A and B... it's just AB. I added your line and I still only get A as the return.

    Katherine

    Leave a comment:


  • Scott Slater
    replied
    Is there maybe a NULL Character between the A and the B ? What you have should return the AB as long as there are not any NULLs.

    Try adding lRec$ = Remove$(lRec$, $Nul) before you call your MSGBOX line.

    Leave a comment:


  • Katherine Lepley
    started a topic Parsing...

    Parsing...

    I have this line of code:

    MSGBOX UCASE$(TRIM$(PARSE$(lRec$,"|",2)))

    and this is part of the file it's reading:

    SANTOPRENCE GRIP|W
    NATURAL CORK|X
    RUBBER CORK COMPOUND|Y
    PINS|Z
    Test|AB

    When I enter AB, only the A is read. How can I get AB to be read?
Working...
X