home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / vrac / cols14.zip / COLSTATU.BAS < prev    next >
BASIC Source File  |  1995-06-06  |  13KB  |  420 lines

  1.  
  2. REM                 TEXT COLUMN INTERCHANGE PROGRAM
  3. REM                          COLSTATU.BAS
  4. REM                 COPYRIGHT (C) 1995 CHUCK BERNT
  5. REM                       ALL RIGHTS RESERVED
  6.  
  7. DECLARE SUB TOTALCOL ()
  8. DECLARE SUB DELIMITERLINEBREAK ()
  9. DIM SHARED C$(1 TO 200), OC$(1 TO 200), TOTAL(1 TO 200), FLDSTART(1 TO 200), FLDLENGTH(1 TO 200), COUNT(1 TO 200), LASTFLDN, NN, INLINE$, DELIMITER$, DELIMITERLEN, DELIMITER2$, TRANSDETECT$, LEAD$, SKIPDUMMY$, LASTCOL
  10. CLS
  11.  
  12. PRINT
  13. INPUT "FILENAME (DO NOT INCLUDE THE EXTENSION .TXT) ="; FILENAME$
  14. PRINT "THE OUTPUT FILENAME WILL BE "; FILENAME$; ".LIS"
  15. PRINT "TYPE CONTROL BREAK TO ABORT (THEN SELECT EXIT FROM THE FILE MENU)"
  16. PRINT
  17. IN$ = FILENAME$ + ".TXT"
  18. OUT$ = FILENAME$ + ".LIS"
  19.  
  20. PRINT
  21. PRINT "  PLEASE DESCRIBE HOW THE COLUMNS ARE SEPERATED (DELIMITED)"
  22. PRINT "  BY ENTERING ONE OF THE FOLLOWING:"
  23. PRINT
  24. PRINT "  CARRIAGE RETURN - FOR ANY GROUP OF ADJACENT WHITE"
  25. PRINT "                    SPACES (SPACES OR TABS)"
  26. PRINT "                S - for any group of adjacent Spaces"
  27. PRINT "                T - for only one Tab"
  28. PRINT "                C - for only one Comma"
  29. PRINT "                F - Fixed format"
  30. PRINT "                O - for Other (more choices)"
  31. PRINT
  32. A:
  33. INPUT LETTER$
  34. CAPLETTER$ = UCASE$(LETTER$)
  35. SELECT CASE CAPLETTER$
  36.        CASE ""
  37.        PRINT "ANY NUMBER OF WHITE SPACES WAS CHOSEN FOR THE DELIMITER"
  38.        DELIMITER$ = " "
  39.        DELIMITER2$ = CHR$(9)
  40.        TRANSDETECT$ = "YES"
  41.  
  42.        CASE "C"
  43.        PRINT "ONE COMMA WAS CHOSEN FOR THE DELIMITER"
  44.        DELIMITER$ = ","
  45.  
  46.        CASE "S"
  47.        PRINT "ANY NUMBER OF SPACES WAS CHOSEN FOR THE DELIMITER"
  48.        DELIMITER$ = " "
  49.        DELIMITER2$ = " "
  50.        TRANSDETECT$ = "YES"
  51.        SKIPDUMMY$ = "YES"
  52.  
  53.        CASE "T"
  54.        PRINT "ONE TAB WAS CHOSEN FOR THE DELIMITER"
  55.        DELIMITER$ = CHR$(9)
  56.  
  57.        CASE "O"
  58.        PRINT "  THE DELIMITER CAN BE SPECIFIED IN ONE OF TWO WAYS."
  59.        PRINT "  THE DELIMITER CAN BE EITHER TYPED DIRECTLY OR IT'S"
  60.        PRINT "  ASCII CODE CAN BE SPECIFIED."
  61.        GOTO C
  62.        
  63.        CASE "F"
  64.        PRINT "FIXED FORMAT WAS CHOSEN"
  65.        GOTO F
  66.        
  67.        CASE ELSE
  68.        PRINT "OPS PLEASE TRY AGAIN"
  69.        GOTO A
  70. END SELECT
  71. GOTO K
  72.  
  73. F:
  74. PRINT
  75. PRINT " INPUT FIELDS ARE SPECIFIED BY ENTERING THE STARTING POSITION"
  76. PRINT " OF EACH FIELD ALONG WITH THE ENDING POSITION OF THE LAST FIELD."
  77. PRINT " THE DOS EDITOR CAN BE USED TO FIND THESE POSITIONS."
  78. PRINT
  79. PRINT " THE PROGRAM WILL MOVE THE FIELD LENGTHS ALONG WITH THE FIELDS"
  80. PRINT " AND ADD LENGTH AS REQUIRED BY NEW FIELDS."
  81. PRINT
  82. PRINT " PLEASE TYPE IN THE STARTING POSITION OF EACH FIELD."
  83. PRINT " ENTER A BLANK LINE TO END."
  84. FLDN = 1
  85. PRINT
  86. PRINT "STARTING POSITION OF FIELD NUMBER"; FLDN; "=";
  87. INPUT FLDSTART(FLDN)
  88. LASTFLDN = FLDN
  89. FLDN = 2
  90.  
  91.  
  92. INPUTFLD:
  93. PRINT "STARTING POSITION OF FIELD NUMBER"; FLDN; "=";
  94. INPUT FLDSTART(FLDN)
  95. IF FLDSTART(FLDN) = 0 THEN GOTO LASTFLD
  96. FLDLENGTH(LASTFLDN) = FLDSTART(FLDN) - FLDSTART(LASTFLDN)
  97. LASTFLDN = FLDN
  98. FLDN = FLDN + 1
  99. GOTO INPUTFLD
  100.  
  101. LASTFLD:
  102. PRINT
  103. PRINT "ENDING POSITION OF THE LAST FIELD =";
  104. INPUT FLDSTART(FLDN)
  105. FLDLENGTH(LASTFLDN) = FLDSTART(FLDN) - FLDSTART(LASTFLDN) + 1
  106. GOTO K
  107.  
  108. C:
  109. PRINT "  MOST COMMON CHARACTERS SUCH AS THE SPACE,"
  110. PRINT "  SEMICOLON, COLON AND PERIOD CAN BE ENTERED"
  111. PRINT "  DIRECTLY.  FOR THE QUOTATION MARK, LINEFEED"
  112. PRINT "  AND ETC. YOU WILL NEED TO ENTER THE ASCII CODE."
  113. PRINT "  THE DELIMITER CAN CONTAIN MORE THEN ONE CHARACTER"
  114.  
  115. PRINT
  116. PRINT " IF YOU WANT TO SPECIFY THE ASCII CODE"
  117. PRINT " TYPE Y OR YES OTHERWISE TYPE ENTER."
  118. PRINT
  119. INPUT "DO YOU WANT TO SPECIFY ASCII CODE ="; CODE$
  120. CODE$ = UCASE$(CODE$)
  121. IF CODE$ = "Y" THEN CODE$ = "CODE"
  122. IF CODE$ = "YES" THEN CODE$ = "CODE"
  123.  
  124. IF CODE$ <> "CODE" THEN GOTO CHAR
  125. PRINT " TYPE ONLY ONE ASCII CODE PER LINE AND ENTER A BLANK"
  126. PRINT " LINE TO END.  SOME COMMON ASCII CODES ARE:"
  127. PRINT
  128. PRINT "COMMA=044 CR=013 LINEFEED=010 SPACE=032 TAB=009"
  129. PRINT
  130.  
  131.  
  132. I:
  133. INPUT "CHARACTER'S ASCII CODE"; OLDCODE
  134. IF OLDCODE = 0 THEN PRINT : GOTO K
  135. DELIMITER$ = DELIMITER$ + CHR$(OLDCODE)
  136. GOTO I
  137.  
  138.  
  139. CHAR:
  140. PRINT "USE DOUBLE QUOTATION MARKS WHEN USING COMMAS, SPACES & ETC."
  141. PRINT "YOU DON'T NEED THE QUOTATION MARKS FOR THE . ; OR:"
  142. PRINT
  143. INPUT "ENTER THE DELIMITER'S CHARACTER(S) "; DELIMITER$
  144.  
  145. K:
  146. IF LASTFLDN <> 0 THEN GOTO TOTAL
  147. PRINT
  148. PRINT " WOULD YOU LIKE THE PROGRAM TO CHECK EVERY INPUT LINE FOR AN"
  149. PRINT " EXPECTED NUMBER OF COLUMNS AND LIST ALL EXCEPTIONS TO "
  150. PRINT " "; FILENAME$; ".ERR ?  THESE LINES WILL STILL BE PROCESSED IN"
  151. PRINT " ALL OTHER RESPECTS AS IF ERROR CHECKING HAD NOT BEEN CARRIED"
  152. PRINT " OUT.  ENTER A BLANK LINE FOR NO INPUT ERROR CHECKING."
  153. PRINT
  154. INPUT "EXPECTED NUMBER OF INPUT COLUMNS = "; EXPECTNUMCOLS
  155. IF EXPECTNUMCOLS <> 0 THEN
  156. ERRORFILE$ = FILENAME$ + ".ERR"
  157. OPEN ERRORFILE$ FOR OUTPUT AS #3
  158. ELSE
  159. END IF
  160.  
  161. TOTAL:
  162. PRINT
  163. PRINT "THE PROCESS TIME WILL INCREASE IF THE COLUMNS ARE TOTALED."
  164. PRINT "TYPE Y OR YES TO TOTAL OUTPUT COLUMNS OTHERWISE TYPE ENTER."
  165. PRINT
  166. INPUT "DO YOU WANT TO TOTAL THE OUTPUT COLUMNS"; TOTALCOLS$
  167. TOTALCOLS$ = UCASE$(TOTALCOLS$)
  168. IF TOTALCOLS$ = "Y" THEN TOTALCOLS$ = "YES"
  169.  
  170. DELIMITERLEN = LEN(DELIMITER$)
  171. CHANGES = 0
  172. LINENUMBER = 0
  173. LINECHANGES = 0
  174. NUMBEROFERRORS = 0
  175. STARTTIME = TIMER
  176. OPEN IN$ FOR INPUT AS #1
  177. OPEN OUT$ FOR OUTPUT AS #2
  178.  
  179. PRINT
  180. PRINT "     TO SEE A STATUS REPORT JUST HIT THE SPACE BAR OR ANY KEY."
  181. PRINT
  182. PRINT
  183. PRINT "                       *****  TO ABORT  ******"
  184. PRINT
  185. PRINT " 1. TYPE CONTROL BREAK"
  186. PRINT "    (IF YOU HIT CONTROL BREAK BY MISTAKE AND YOU WOULD NOW LIKE"
  187. PRINT "     TO CONTINUE THE PROGRAM, JUST TYPE THE F5 FUNCTION KEY OR"
  188. PRINT "     SELECT CONTINUE FROM THE RUN MENU BEFORE STEP TWO BELOW)."
  189. PRINT
  190. PRINT " 2. THEN EXIT THE BASIC EDITOR TO CLOSE ALL OPEN FILES !!"
  191. PRINT
  192.  
  193. DO UNTIL (EOF(1))
  194.   LINE INPUT #1, INLINE$
  195.  
  196.   STATUSREQ$ = INKEY$
  197. REM STATUSREQ$ = ""
  198.  
  199.   IF STATUSREQ$ <> "" THEN
  200.     ELAPSEDTIME = TIMER - STARTTIME
  201.     LINERATE = LINENUMBER * 60 / ELAPSEDTIME
  202.     PRINT
  203.     PRINT "CHANGING COLUMNS IN LINE # "; LINENUMBER; " OF FILE "; FILENAME$;
  204.     PRINT " "; TIME$
  205.     PRINT "ELAPSED TIME ="; ELAPSEDTIME; "SECS."
  206.     PRINT "LINE PROCESS RATE ="; LINERATE; "LINES/MINUTE"
  207. IF EXPECTNUMCOLS <> 0 THEN PRINT "THE NUMBER OF ERRORS FOUND SO FAR IS"; NUMBEROFERRORS
  208. IF TOTALCOLS$ <> "YES" GOTO SKIPSTATUSTOTAL
  209.     PRINT "THE CURRENT OUTPUT COLUMN RUNNING TOTALS AND AVERAGES"
  210.     PRINT "ARE AS FOLLOWS:"
  211.     PRINT "                      OUTPUT COLUMN RUNNING TOTALS"
  212.       FOR ITOTAL = 1 TO LASTCOL
  213.         IF COUNT(ITOTAL) <> 0 THEN PRINT "COLUMN #"; ITOTAL; " = "; TOTAL(ITOTAL),
  214.       NEXT ITOTAL
  215.       PRINT
  216.     PRINT "                      OUTPUT COLUMN RUNNING AVERAGES"
  217.     FOR ITOTAL = 1 TO LASTCOL
  218.       IF COUNT(ITOTAL) <> 0 THEN PRINT "COLUMN #"; ITOTAL; " = "; TOTAL(ITOTAL) / COUNT(ITOTAL),
  219.     NEXT ITOTAL
  220.     PRINT
  221.     PRINT "WARNING **** THE ABOVE VALUES ARE NOT FINAL ***** WARNING *****"
  222.     PRINT "***************************************************************"
  223. SKIPSTATUSTOTAL:
  224.   ELSE
  225.   END IF
  226. LINENUMBER = LINENUMBER + 1
  227.  
  228.   CALL DELIMITERLINEBREAK
  229.   IF EXPECTNUMCOLS = 0 THEN GOTO SKIPERROR
  230.   IF EXPECTNUMCOLS <> NN THEN
  231.     PRINT #3, INLINE$
  232.     NUMBEROFERRORS = NUMBEROFERRORS + 1
  233.   ELSE
  234.   END IF
  235. SKIPERROR:
  236.   GOSUB GENERATEOUTPUTCOLS
  237.  
  238.  IF TOTALCOLS$ <> "YES" GOTO B
  239.  CALL TOTALCOL
  240.  
  241. B:
  242. IF TRANSDETECT$ = "YES" THEN
  243. LASTDELCOL = LASTCOL - 1
  244. FOR ILDC = 1 TO LASTDELCOL
  245.     PRINT #2, OC$(ILDC); DELIMITER$;
  246.     NEXT ILDC
  247. OC$(LASTCOL) = RTRIM$(OC$(LASTCOL))
  248. PRINT #2, OC$(LASTCOL)
  249.  
  250. ELSE
  251. LASTDELCOL = LASTCOL - 1
  252. FOR ILDC = 1 TO LASTDELCOL
  253.     PRINT #2, OC$(ILDC); DELIMITER$;
  254.     NEXT ILDC
  255. PRINT #2, OC$(LASTCOL)
  256. END IF
  257.  
  258. LOOP
  259. CLOSE
  260. PRINT
  261. CLS
  262. PRINT
  263. PRINT "THE COLUMN CHANGE HAS COMPLETED NORMALLY & ALL FILES ARE CLOSED."
  264. PRINT
  265. PRINT "TOTAL NUMBER OF LINES = "; LINENUMBER
  266. IF EXPECTNUMCOLS <> 0 THEN PRINT "TOTAL NUMBER OF ERRORS FOUND = "; NUMBEROFERRORS
  267. ELAPSEDTIME = TIMER - STARTTIME
  268. LINERATE = LINENUMBER * 60 / ELAPSEDTIME
  269. PRINT "THE ELAPSED TIME ="; ELAPSEDTIME; " SECONDS."
  270. PRINT "THE LINE PROCESSING RATE ="; LINERATE; "LINES PER MINUTE."
  271. PRINT
  272.  
  273. IF TOTALCOLS$ <> "YES" GOTO SKIPTOTAL
  274. PRINT "   THE FOLLOWING ARE TOTALS AND AVERAGES OF NUMERIC OR"
  275. PRINT "   PARTIALLY NUMERIC OUTPUT COLUMNS.  ALL OUTPUT COLUMN"
  276. PRINT "   ENTRIES STARTING WITH A NUMBER ARE INCLUDED."
  277. PRINT
  278. PRINT "                         OUTPUT COLUMN TOTALS"
  279. PRINT
  280. FOR ITOTAL = 1 TO LASTCOL
  281. IF COUNT(ITOTAL) <> 0 THEN PRINT "COLUMN #"; ITOTAL; " = "; TOTAL(ITOTAL),
  282. NEXT ITOTAL
  283. PRINT
  284. PRINT
  285. PRINT "                         OUTPUT COLUMN AVERAGES"
  286. PRINT
  287. FOR ITOTAL = 1 TO LASTCOL
  288. IF COUNT(ITOTAL) <> 0 THEN PRINT "COLUMN #"; ITOTAL; " = "; TOTAL(ITOTAL) / COUNT(ITOTAL),
  289. NEXT ITOTAL
  290. PRINT
  291. PRINT
  292. SKIPTOTAL:
  293. SYSTEM
  294. END
  295.  
  296. SUB DELIMITERLINEBREAK
  297.  
  298. REM     THIS SUBROUTINE BREAKS UP THE INPUT LINE INTO FIELDS.
  299. REM     1. IN THE NORMAL MODE ONLY ONE DELIMITER IS USED AND THIS
  300. REM        DELIMITER IS NOT INCLUDED IN THE OUTPUT FIELDS.
  301. REM        THIS DELIMITER CAN BE ANY LENGTH GIVEN BY THE INPUT DELIMITERLEN.
  302. REM     2. IN THE TRANSITION DETECTION MODE TWO DELIMITERS ARE
  303. REM        USED AND THE DELIMITERS ARE INCLUDED IN THE OUTPUT.
  304. REM        THESE DELIMITERS MUST EACH BE ONLY ONE CHARACTER LONG.
  305. REM     3. IN THE FIXED FIELD MODE NO DELIMITER IS USED.
  306. REM
  307. REM     INPUTS TO THE SUBROUTINE:
  308. REM        INLINE$      - THE LINE TO BE DIVIDED INTO COLUMNS.
  309. REM        DELIMITER$   - THE DELIMITER THAT WILL DETERMINE COLUMN BREAKS.
  310. REM        DELIMITER2$  - "OR"ed WITH DELIMITER$ IN THE TRANSITION MODE.
  311. REM        DELIMITERLEN - THE LENGTH OF THE DELIMITER IN CHARACTERS.
  312. REM        TRANSDETECT$ - SPECIFIES THE MODE.
  313. REM        FLDSTART     - A VECTOR CONTAINING THE INPUT FIELD STARTING POSITIONS.
  314. REM        FLDLENGTH    - A VECTOR CONTAINING THE INPUT FIELD LENGTHS.
  315. REM        LASTFLDN     - THE LAST INPUT FIELD
  316. REM
  317. REM     OUTPUTS FROM THE SUBROUTINE:
  318. REM        C$(1 TO NN) - A VECTOR CONTAINING THE INLINE$'S COLUMNS
  319. REM        NN          - THE LAST COLUMN NUMBER
  320.  
  321.  
  322.   ERASE C$
  323.   NN = 1
  324.   START = 1
  325.   IF TRANSDETECT$ = "YES" THEN GOTO TRANS
  326.   IF LASTFLDN = 0 GOTO NOTRANS
  327.   FOR NN = 1 TO LASTFLDN
  328.       C$(NN) = MID$(INLINE$, FLDSTART(NN), FLDLENGTH(NN))
  329.   NEXT NN
  330.   EXIT SUB
  331.  
  332. NOTRANS:
  333.   DELPOS = INSTR(START, INLINE$, DELIMITER$)
  334.   IF DELPOS = 0 THEN DELPOS = 1000
  335.   LENGTH = DELPOS - START
  336.   C$(NN) = MID$(INLINE$, START, LENGTH)
  337.   IF DELPOS = 1000 THEN EXIT SUB
  338.   START = DELPOS + DELIMITERLEN
  339.   NN = NN + 1
  340.   GOTO NOTRANS
  341.  
  342. TRANS:
  343. STARTC = 1
  344. STARTD = 1
  345. INLINE$ = LTRIM$(INLINE$)
  346. DUMMY$ = INLINE$
  347. IF SKIPDUMMY$ = "YES" THEN GOTO ENDDUMMY
  348.  
  349. STARTDUMMY:
  350. DELPOS2 = INSTR(STARTD, DUMMY$, DELIMITER2$)
  351. IF DELPOS2 = 0 THEN GOTO ENDDUMMY
  352. MID$(DUMMY$, DELPOS2, 1) = DELIMITER$
  353. STARTD = DELPOS2 + 1
  354. GOTO STARTDUMMY
  355.  
  356. ENDDUMMY:
  357.  
  358. REM FIND FIRST FALL
  359. DELPOST = INSTR(1, DUMMY$, DELIMITER$)
  360. IF DELPOST = 0 THEN GOTO LASTCOL
  361. STARTC = DELPOST + 1
  362.  
  363. FINDNEXTCOL:
  364.  
  365. REM FIND NEXT TEXT
  366. DELPOS = INSTR(STARTC, DUMMY$, DELIMITER$)
  367. IF DELPOS = 0 THEN DELPOS = 1000
  368. INCREMENT = DELPOS - STARTC
  369. STARTC = STARTC + 1
  370. IF INCREMENT = 0 THEN GOTO FINDNEXTCOL
  371. RISE = STARTC - 1
  372. FALL = DELPOS
  373.  
  374. LENGTH = RISE - START
  375. C$(NN) = MID$(INLINE$, START, LENGTH)
  376. START = RISE
  377. NN = NN + 1
  378. IF DELPOS = 1000 THEN GOTO LASTCOL
  379. STARTC = FALL + 1
  380. GOTO FINDNEXTCOL
  381.  
  382. LASTCOL:
  383. LENGTH = 1000
  384. C$(NN) = MID$(INLINE$, START, LENGTH) + DELIMITER$
  385. EXIT SUB
  386.  
  387. END SUB
  388.  
  389. SUB TOTALCOL
  390. REM CALCULATE TOTALS
  391.   FOR ICOL = 1 TO LASTCOL
  392.    OCSTRING$ = OC$(ICOL)
  393.    OCSTRING$ = UCASE$(OCSTRING$)
  394.    ELOCATION = INSTR(1, OCSTRING$, "E")
  395.    IF ELOCATION <> 0 THEN MID$(OCSTRING$, ELOCATION, 1) = "X"
  396.    DLOCATION = INSTR(1, OCSTRING$, "D")
  397.    IF DLOCATION <> 0 THEN MID$(OCSTRING$, DLOCATION, 1) = "X"
  398.    INCRTOTAL = VAL(OCSTRING$)
  399.    TOTAL(ICOL) = TOTAL(ICOL) + INCRTOTAL
  400.    IF INCRTOTAL <> 0 THEN GOTO INCREMENTCOUNT
  401.    OCSTRING$ = LTRIM$(OCSTRING$)
  402.    ZERO = INSTR(1, OCSTRING$, "0")
  403.    IF ZERO = 0 OR ZERO > 3 THEN GOTO SKIPCOUNT
  404.    IF ZERO = 1 THEN GOTO INCREMENTCOUNT
  405.    C1$ = MID$(OCSTRING$, 1, 1)
  406.    IF C1$ <> "." AND C1$ <> "+" AND C1$ <> "-" THEN GOTO SKIPCOUNT
  407.    IF ZERO = 2 THEN GOTO INCREMENTCOUNT
  408.    C2$ = MID$(OCSTRING$, 2, 1)
  409.    IF C1$ <> "." AND C2$ = "." AND ZERO = 3 THEN GOTO INCREMENTCOUNT
  410.    GOTO SKIPCOUNT
  411. INCREMENTCOUNT:
  412. COUNT(ICOL) = COUNT(ICOL) + 1
  413. SKIPCOUNT:
  414.  
  415.   NEXT ICOL
  416.  
  417.  
  418. END SUB
  419.  
  420.