Voilà le début de la bête
Pour l'instant, on peut créer le fichier, ajouter des champs à la fin, en inserer au milieu de la base.
J'aurais peut-être pu faire plus rapide, mais je ne sais pas comment.
Faudrait que je voie ça...
Bon, pour le moment, ça donne ça :
Code : Tout sélectionner
Structure CHAMPS
Index.b
Insertion.w
EndStructure
NewList Valeur.CHAMPS()
Declare DB_CsvInsertField(Position.b, Name.s)
Global Temp$
;- Ouverture de la base
Procedure DB_CsvOpen(Index.b, Fichier.s)
If ReadFile(Index,Fichier) = 0
CreateFile(Index,Fichier)
CloseFile(Index)
Else
CloseFile(Index)
EndIf
If OpenFile(Index,Fichier) = 0
MessageRequester("Erreur","Impossible d'ouvrir le fichier!!!",#PB_MessageRequester_Ok|#MB_ICONERROR)
EndIf
EndProcedure
;- Fermeture de la base
Procedure DB_CsvClose(Index.b)
CloseFile(Index)
EndProcedure
;- Ajout de champs à la fin de la base
Procedure DB_CsvCreateField(Position.b, Name.s)
Field.s = Chr(34) + Name + Chr(34) ; on ajoute les guillemets
FileSeek(0) : Temp$ = ReadString() ; lecture de la ligne des champs
If Len(Temp$) = 0 ; si la longueur est à 0
WriteString(Field) ; ecrit le champ tel quel
ElseIf Len(Temp$) > 0 ; sinon, si la longueur > 0
If FindString(Temp$,Field,0) = 0 ; et si le nom n'existe pas déjà
If Position = -1 ; si "Position" = -1
FileSeek(Len(Temp$)) ; déplace le pointeur à la fin
WriteString(";"+Field) ; écrit la valeur
Else ; sinon, si "Position" <> -1
; appelle la procedure d'insertion
DB_CsvInsertField(Position, Name)
EndIf
EndIf
EndIf
EndProcedure
;- Insertion de champs au milieu de la base
Procedure DB_CsvInsertField(Position.b, Name.s)
Field.s = Chr(34) + Name + Chr(34) + ";" ; on ajoute les guillemets
FileSeek(0) : Temp$ = ReadString() ; lecture de la ligne des champs
;** Appel de procedure Anti Neu-Neu ****************************************************
If Len(Temp$) = 0 ; Pour les neu-neu qui voudraient
DB_CsvCreateField(Position, Name) ; "Inserer" un champ dans une
EndIf ; base vide... ;o)
;**************************************************************************************
Start = 1 : NumChamps = 0 ; Initialise les variables
Repeat ;
pos = FindString(Temp$,";",Start) ; recherche le séparateur
If pos > 0 ; si il existe
AddElement(Valeur()) ; on stocke les valeurs dans la liste
Valeur()\Index = NumChamps ; N° du champ
Valeur()\Insertion = pos ; Position
EndIf
NumChamps + 1 : Start = pos +1 ;
Until pos = 0 ; jusqu'à la fin
SelectElement(Valeur(),Position -1)
InsPoint = Valeur()\Insertion
G_Tmp$ = Left(Temp$,InsPoint)
R_Tmp$ = Right(Temp$,Len(Temp$) - InsPoint)
If AllocateMemory(0,256,0)
*Pointer = MemoryID()
CopyMemoryString(G_Tmp$,@*Pointer)
CopyMemoryString(Field)
CopyMemoryString(R_Tmp$)
Temp$ = PeekS(MemoryID())
FileSeek(0)
WriteString(Temp$)
FreeMemory(0)
EndIf
EndProcedure
;/ Commandes de test
DB_CsvOpen(0,"Liens.csv") ; Ouvre la base, ou en crée une
DB_CsvCreateField(-1, "Champ 0") ; Insère 4 champs l'un à la suite de l'autre
DB_CsvCreateField(-1, "Champ 1")
DB_CsvCreateField(-1, "Champ 2")
DB_CsvCreateField(-1, "Champ 3")
; Insertion de champs : Le premier est le champ 0
DB_CsvCreateField(4, "Champ 4") ; Insère un champ à la position 4
DB_CsvCreateField(1, "Champ 5") ; Insère un champ à la position 1
DB_CsvClose(0)
Code : Tout sélectionner
DB_CsvClose() ; Ferme le fichier
DB_CsvCreateField() ; Crée un champ dans la base
DB_CsvInsertField() ; Insère un champ à une position donnée
DB_CsvOpen() ; Ouvre une base, ou en crée une
DB_CsvDeleteField() ; Supprime un champ
DB_CsvDeleteItem() ; Supprime une fiche
DB_CsvFindItem() ; Recherche une fiche
DB_CsvCountField() ; Retourne le nombre de champs
DB_CsvGetFieldIndex() ; Retourne l'index du champ sélectionné
DB_CsvGetFieldName() ; Retourne le nom du champ sélectionné
DB_CsvItemCount() ; Retourne le nombre de fiches
DB_CsvItemIndex() ; Retourne l'index de la fiche sélectionnée
DB_CsvItemValue() ; Retourne la valeur de la fichie (Champ/Fiche)
DB_CsvInsertItem() ; Insère une nouvelle fiche
DB_CsvMergeItems() ; Fusionne deux bases
DB_CsvReset() ; Réinitialise la base (Supprime Champs et Fiches)
DB_CsvResetItems() ; Supprime toutes les fiches
DB_CsvResetSelectedItem() ; Vide la fiche, sans l'effacer
DB_CsvSetFieldName() ; Change le nom d'un champ
DB_CsvSetItemValue() ; Inscrit une valeur dans une fiche (Ligne/Colonne)
Chris