Code archives/File Utilities/CSV Generator
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Generates nice friendly useful code for your database/spreadsheet files stored in .csv format. (Comma Seperated Values, as exported by Excel and most spreadsheets) Update your code instantly if you add/delete fields. Use multiple CSV files with a single include. Uses multiple files, please download complete files from http://www.mirex.demon.co.uk/blitz Enjoy ! ============================ CSV Database Generator ! Lousy Documentation ============================ Copyright Keith Hill, Aug 2002 Braneloc@... Purpose: Nice friendly CSV data files for your custom TYPE lists and standard functions to do stuff with them. Usage: Stick all your CSV databases in a directory Have a nice database_code directory Run this program, it will create.... "db_code/database.bb" master include for all generated databases code that does the following... (where TYPE is the name of your csv.database) TYPE_load Load the entire type list into memory TYPE_kill Free the entire type list from memory TYPE_save Save the entire type list to file TYPE_add Add a TYPE to memory - requires full parameters TYPE_find Find a type in your list indexed on the first field TYPE_count How many of these darn things have you loaded ? TYPE_fadd Find-and-Add - create a new one if it does not exist TYPE_sort Sorts the memory list into order Licence: Use it as you see fit, free of charge for all projects ! (Though I'd appreciate an email if you use it in your projects) Ownership and copyright of the generator code and template remain with Braneloc@... at all times. Please send me any updates(!) Distribution: You are quite free to distribute any generated code or executables based on generated code as you see fit, though the code generator/template (source or executable) may not be distributed without prior consent of Braneloc@... at all times for any use. (Especially if you are making a profit and I am not !) Template: { name of "type" # first field of type ¬ duplicate line for each field of type } field in duplicated line ~ entire data structure Main program code (July03) ("csv-codegen.bb") ; ; ; CSV Database Generator !! ; ; (c) K.Hill, Aug 2002 ; ; ; Include "misc.bb" ;Include "db_code/database.bb" Global qq,name$,topline$ Global codedir$="db_code/" Global datadir$="database" ; ; Installation. ; The two directories above, codedir$ and datadir$ should be created.. ; Put the template file into the CODEdir ; Put any CSV files into the DATAdir ; ; ; Usage: Ok, once installation is done, you can auto-gen code to handle CSV files ; as types by running this file. In *your* code, just include either the ; generated code file ( something_csv.bb) or "database.bb" (which contains ; includes of all includes :) It should all be fairly simple after that. ; ; ; Lousy Documentation ; (in templates) ; ; { name of "type" ; # first field of type ; ¬ duplicate line for each field of type ; } field in duplicated line ; £ field in duplicated line - without type ; ~ entire data structure ; master=WriteFile(codedir$+"database.bb") Restore base:a$=";" While a$<>"***" Read a$ If a$<>"***" WriteLine master,a$ EndIf Wend WriteLine master,";Include "+Chr$(34)+"Misc.bb"+Chr$(34) WriteLine master,"Global csv_dir$:csv_dir$="+Chr$(34)+datadir$+"/"+Chr$(34) name$="_" dd=ReadDir(datadir$) While name$<>"" ;name$="test" name$=NextFile$(dd) ;Print name$ If name$<>"" If FileType(name$)<>2 name$=killext(name$) process(name$) WriteLine master,"Include "+Chr$(34)+codedir$+name$+"_csv.bb"+Chr$(34) EndIf EndIf Wend CloseDir dd CloseFile master Function killext$(a$) For n=1 To Len(a$) b$=Mid$(a$,n,1) If b$="." Return z$ Else z$=z$+b$ EndIf Next Return z$ End Function Function process(name$) Print "Processing..."+datadir$+"/"+name$+".csv" f=ReadFile(datadir$+"/"+name$+".csv") qq=WriteFile(codedir$+name$+"_csv.bb") topline$=ReadLine$(f) split_csv(topline$) For n=1 To 10 ; Print split$(n) Next ;Restore start:codechunk() ;pp( "Type "+name$) ;template(" Field ") ;pp("End Type") CloseFile f f=ReadFile(codedir$+"csv-template!.bb") While Not Eof(f) a$=ReadLine(f) If Mid$(a$,1,1)="¬" For ff=1 To WORDSNUM If split$(ff)<>"" procline(Mid$(a$,2),ff) EndIf Next Else procline(a$) EndIf Wend CloseFile f CloseFile qq End Function Function procline(a$,ff=1) z$="" For n=1 To Len(a$) b$=Mid$(a$,n,1) Select b$ Case "{" z$=z$+name$ Case "#" z$=z$+split$(1) Case "}" z$=z$+split$(ff) Case "£" z$=z$+notype$(split$(ff)) Case "~" z$=z$+topline$ Default z$=z$+b$ End Select Next pp(z$) End Function Function notype$(a$) z$=Right$(a$,1) If z$="#" Or z$="%" Or z$="$" Return Mid$(a$,1,Len(a$)-1) Else Return a$ EndIf End Function Function codechunk() a$=";" While a$<>"***" Read a$ If a$<>"***" pp( a$) EndIf Wend Print ";" End Function Function template(a$="",b$="") z$="" For n=1 To WORDSNUM If split$(n)<>"" pp( a$+split$(n)+b$) EndIf Next End Function Function pp(a$) ; Print a$ WriteLine qq,a$ End Function .start Data "; Generated code Data "; CSV Database system Data "; By Braneloc, Aug 2002 Data "; Data "; Data "; Global csv_dir$ Data "**** .base Data "; Data "; Data "; Generated database include Data "; Data "; (c) K.Hill, Aug 2002 Data "; Contains all database includes for the project Data "; Data "; Data "**** TEMPLATE code (july03) ("db_code/csv-template!.bb") ; ; ; Generated code ; CSV Database system ; By Braneloc, Aug 2002 ; ; ; {.csv ; ~ ; ;include "misc.bb" ;Global csv_dir$:csv_dir$="database/" Type { ¬ Field } End Type Function {_pack$(q.{) a$="" ¬ a$=a$+q\}+"," Return a$ End Function Function {_data.{(a$) If a$<>"" split_csv(a$) tag=1 q.{=New { ¬ q\}=split$(tag):tag=tag+1 EndIf Return q.{ End Function Function {_load() f=ReadFile(csv_dir$+"{.csv") a$=ReadLine(f) ; header line While Not Eof(f) a$=ReadLine(f) If a$<>"" split_csv(a$) tag=1 q.{=New { ¬ q\}=split$(tag):tag=tag+1 EndIf Wend CloseFile(f) End Function Function {_kill() For n.{=Each { Delete n Next End Function Function {_save() f=WriteFile(csv_dir$+"{.csv") WriteLine f,"~" For q.{=Each { a$="" ¬ a$=a$+q\}+"," WriteLine f,a$ Next CloseFile(f) End Function Function {_saveXML() f=WriteFile(csv_dir$+"{.XML") WriteLine f,"<?xml version="+z$+"1.0"+z$+" encoding="+z$+"utf-8"+z$+" ?>" WriteLine f,"<{_list>" For q.{=Each { WriteLine f,"<{>" ¬ WriteLine f," <£>"+q\£+"</£>" WriteLine f,"</{>" Next WriteLine f,"</{_list>" WriteFile f CloseFile (f) End Function Function {_add(~) q.{=New { ¬ q\}=} End Function Function {_find.{(#) For n.{=Each { If n\#=# Return n EndIf Next Return Null End Function Function {_count() tag=0 For n.{=Each { tag=tag+1 Next Return tag End Function Function {_fadd.{(#) tag.{=Null For n.{=Each { If n\#=# tag=n EndIf Next If tag=Null tag=New { EndIf Return tag End Function Function {_sort() Repeat swapped=False For {.{ = Each { afterType.{=After { If (afterType<>Null) If (afterType\# < {\#) Insert afterType Before { swapped=True EndIf EndIf Next Until Not swapped End Function ("misc.bb") ; ; ; (edited) Miscellaneous stuff ; ; (c) K.Hill, June 2001 ; Braneloc@... ; Const WORDSNUM = 100 Dim split$(WORDSNUM ) Function split_csv(a$) ;# splits up a line of text into words s=1 For n=1 To WORDSNUM split$(n)="" Next For n=1 To Len(a$) z$=Mid$(a$,n,1) If z$="," split$(s)=Trim (split$(s)) s=s+1 Else split$(s)=split$(s)+z$ EndIf Next split$(s)=Trim (split$(s)) End Function Sample CSV file... ("database/test.csv") Note the first line contains the TYPENAMEs | |||||
name$,email$,comment$ Braneloc,Braneloc@mirex.demon.co.uk,Author of this stuff |
Comments
None.
Code Archives Forum