Article View: comp.apps.spreadsheets
Article #336DIF or SYLK parser?
From: Marc Ries
Date: Tue, 14 Nov 1995 20:31
Date: Tue, 14 Nov 1995 20:31
103 lines
5196 bytes
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-mailShow 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