Code archives/File Utilities/CSV Generator

This code has been declared by its author to be Public Domain code.

Download source code

CSV Generator by Braneloc2002
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