🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.apps.spreadsheets
Article #336

DIF or SYLK parser?

#336
From: Marc Ries
Date: Tue, 14 Nov 1995 20:31
103 lines
5196 bytes
I need to be able to extract the data in a DIF or SYLK file(s).

I have cruised the internet with little or no concrete examples
in archives or newsgroups.

One poster did pass along a document that included a BASIC
program for reading a sample DIF file.

Can any Basic->C programmers translate the following for me? Even
better, does anyone know of source (C or awk) for parsing a SYLK
or DIF spreadsheet file? Thanks

Marc Ries
ries@venice.sedd.trw.com


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Sample BASIC program that reads a DIF file

This program uses the output DIF file from the previous sample
to calculate an average score and letter grade for each student.

     100 :REM - THIS PROGRAM READS A DIF FILE CONTAINING THE TEST
     110 :REM - SCORES OF A GROUP OF STUDENTS, CALCULATES AN AVERAGE
     120 :REM - SCORE FOR EACH STUDENT, MATCHES THE AVERAGE TO A LETTER
     130 :REM - GRADE, AND PRINTS THE STUDENT'S NAME, AVERAGE,
     140 :REM - AND LETTER GRADE.

     500 DIM T(100)                     :REM - MAXIMUM OF 100 VECTORS.
     510 DIM V(100)                     :REM - T IS THE TYPE INDICATOR,
     520 DIM V$ (100)                   :REM - V IS THE NUMBER VALUE,
     530                                :REM - AND V$ IS THE STRING
     535                                :REM - VALUE OF EACH DATA VALUE.
     540 GOSUB 5000                     :REM - INITIALIZATION SUBROUTINE
     550 GOSUB 6000                     :REM - SUBROUTINE TO READ HEADER
     560  FOR I = 1 TO NT               :REM - FOR EACH TUPLE,
     570    GOSUB 7000                  :REM - GET ALL VECTOR ELEMENTS
     575                                :REM -   IN TUPLE.
     580    M=0                         :REM - M = SUM OF THE SCORES
     590    FOR J = 1 TO NV             :REM - FOR EACH VECTOR VALUE,
     600     IF T(J)=1 THEN PRINT V$(J) :REM - PRINT NAME.
     610     IF T(J)=0 THEN M = M+V(J)  :REM - ADD SCORES.
     620    NEXT J
     630  M = M/(NV-1): PRINT M         :REM - PRINT STUDENTS' AVERAGE
     640  IF M<=50 THEN PRINT "THIS STUDENT'S FINAL GRADE IS F"
     650  IF M<=70 AND M>50 THEN PRINT "THIS STUDENT'S FINAL GRADE IS D"
     660  IF M<=85 AND M>70 THEN PRINT "THIS STUDENT'S FINAL GRADE IS C"
     670  IF M<=94 AND M>85 THEN PRINT "THIS STUDENT'S FINAL GRADE IS B"
     680  IF M>94 THEN PRINT "THIS STUDENT'S FINAL GRADE IS A"
     690 NEXT I
     700 CLOSE 2
     710 PRINT "FINISHED CALCULATING GRADES"
     720 STOP

     5000                               :REM - INITIALIZATION CODE.
     5010 PRINT "FILE NAME";
     5020 INPUT F$
     5030 OPEN "I",2,F$                 :REM - OPEN FILE FOR INPUT.
     5040 NV = 0                        :REM - INITIAL VECTOR COUNT.
     5050 NT = 0                        :REM - INITIAL TUPLE COUNT.
     5060 RETURN

     6000 :REM - READ HEADER. GET NUMBER OF VECTORS AND TUPLES.
     6010 INPUT#2,T$                    :REM - GET TOPIC.
     6020 INPUT#2,S,N                   :REM - GET VECTOR NUMBER & VALUE
     6030 INPUT#2,S$                    :REM - GET STRING VALUE
     6040 IF T$="VECTORS" THEN 6500     :REM - CHECK FOR KNOWN HEADER
     6050 IF T$="TUPLES" THEN 6600      :REM -         ITEMS.
     6060 IF T$="DATA" THEN RETURN      :REM - "DATA" ENDS HEADER
     6070 GOTO 6010                     :REM - IGNORE UNKNOWN ITEMS.
     6500 NV = N                        :REM - NUMBER OF VECTORS
     6510 IF NV<=100 THEN 6010          :REM - CHECK FOR < 100 VECTORS
     6520 PRINT "TOO MANY VECTORS.  PROGRAM CAPACITY 100 VECTORS."
     6530 CLOSE 2
     6540 STOP
     6600 NT = N                        :REM - NUMBER OF TUPLES.
     6610 GOTO 6010                     :REM - GET NEXT HEADER ITEM.

     7000 :REM - SUBROUTINE TO GET ALL VECTOR ELEMENTS IN A TUPLE.
     7010 GOSUB 8000                    :REM - GET NEXT DATA VALUE.
     7020 IF T1<>-1 THEN 9000           :REM - MUST BE A BOT, ELSE ERROR
     7030 IF S$<>"BOT" THEN 9000
     7040      FOR K=1 TO NV            :REM - GET EACH DATA VALUE.
     7050           GOSUB 8000
     7060           IF T1>1 THEN 9000
     7070           T(K) = T1           :REM - SAVE TYPE INDICATOR.
     7080           V(K) = V1           :REM - SAVE NUMBER VALUE.
     7090           V$(K) = S$          :REM - SAVE STRING VALUE.
     7100      NEXT K
     7110 RETURN

     8000 :REM - SUBROUTINE TO GET NEXT DATA VALUE.
     8010 INPUT#2,T1,V1                 :REM - GET TYPE INDICATOR
     8020 INPUT#2,S$                    :REM - NUMERIC VALUE, AND
     8030 RETURN                        :REM - STRING VALUE.

     9000 :REM - ERROR ROUTINE
     9010 PRINT "ERROR IN FILE FORMAT"
     9020 CLOSE 2                       :REM - END PROGRAM
     9030 STOP
     9040 END
Technical Details
Message-ID: <48aubu$d9d@venice.sedd.trw.com>
Path: arc1-ca.pugleaf.net!news.trw.com!venice!venice!not-for-mail

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.trw.com!venice!venice!not-for-mail
From: ries@venice.sedd.trw.com (Marc Ries)
Newsgroups: comp.apps.spreadsheets,comp.lang.c
Subject: DIF or SYLK parser?
Date: 14 Nov 1995 12:31:58 -0800
Organization: Data Technologies Division
Distribution: usa
Message-ID: <48aubu$d9d@venice.sedd.trw.com>
NNTP-Posting-Host: venice.sedd.trw.com