CVS-Texteinträge sortieren
Little John: Struktur kann dynamisch sein. Ich lege das ja fest.
Bin zum Pferdestehlen bereit.
mk-soft: Jetzt verwirre mich nicht. Geht das mit einer CSV-Datei tatsächlich.
Normalerweise würde ich ja MySQL verwenden, aber ich wollte nicht mit Kanonen auf Spatzen schießen. Mit dem SQL-Dialekt kenne ich mich wieder aus.
Jetzt werden meine alten Gehirnzellen aber in Streß versetzt.
Dann müßte der Abgleich ja auch per SQL gehen? Oder?????
Bin zum Pferdestehlen bereit.
mk-soft: Jetzt verwirre mich nicht. Geht das mit einer CSV-Datei tatsächlich.
Normalerweise würde ich ja MySQL verwenden, aber ich wollte nicht mit Kanonen auf Spatzen schießen. Mit dem SQL-Dialekt kenne ich mich wieder aus.
Jetzt werden meine alten Gehirnzellen aber in Streß versetzt.
Dann müßte der Abgleich ja auch per SQL gehen? Oder?????
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
meines wissens kann eine struktur nicht dynamisch sein, also zur Laufzeit verändert werden.
auch bei arrays ist die dynamik eingeschränkt, es ist mittels ReDim nur
ein ändern der letzen, äußeren Dimension möglich. (mehrdimensionale Arrays)
auch bei arrays ist die dynamik eingeschränkt, es ist mittels ReDim nur
ein ändern der letzen, äußeren Dimension möglich. (mehrdimensionale Arrays)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
@dysti
klar geht das alles mit SQL und die Treiber sind bei Windows auch gleich dabei.
Die DSN "Text-Dateien" müsste als Standard auch schon vorhanden sein
Siehe mal nach Start -> Ausführen -> odbcad32 -> Benutzer DSN
FF
Edit: Die Telefon.csv für den Test ist erste Zeile: "Nummer;Namen;Vornamen;Telefon"
P.S. ich habe aber noch probleme wenn in sql dir die Datei (mit Path) ein leerzeichen beinhaltet. Bei "Select * From Dateiname" weiss ich nicht die eingrenzung. Anführungszeichen geht nicht.
klar geht das alles mit SQL und die Treiber sind bei Windows auch gleich dabei.
Die DSN "Text-Dateien" müsste als Standard auch schon vorhanden sein
Siehe mal nach Start -> Ausführen -> odbcad32 -> Benutzer DSN
FF

Edit: Die Telefon.csv für den Test ist erste Zeile: "Nummer;Namen;Vornamen;Telefon"
P.S. ich habe aber noch probleme wenn in sql dir die Datei (mit Path) ein leerzeichen beinhaltet. Bei "Select * From Dateiname" weiss ich nicht die eingrenzung. Anführungszeichen geht nicht.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Code: Alles auswählen
Die DSN "Text-Dateien" müsste als Standard auch schon vorhanden sein
Siehe mal nach Start -> Ausführen -> odbcad32 -> Benutzer DSN
Bei der Benutzer-DSN nicht. Wollte neu einfügen, weiss aber nicht was ich eintragen muß. Geht das nicht auch mit Hilfe von PB?
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
DB-Helper
FF 
Code: Alles auswählen
;-TOP
; Kommentar : DSN Helper
; Version : v1.02
; Author : Michael Kastner
; Datei : DbHelper.pb
; Erstellt : 28.09.2006
; Geändert : 13.10.2006
; ***************************************************************************************
Enumeration 1
#ODBC_ADD_DSN ; // Add data source
#ODBC_CONFIG_DSN ; // Configure (edit) Data source
#ODBC_REMOVE_DSN ; // Remove data source
#ODBC_ADD_SYS_DSN ; // add a system DSN
#ODBC_CONFIG_SYS_DSN ; // Configure a system DSN
#ODBC_REMOVE_SYS_DSN ; // remove a system DSN
#ODBC_REMOVE_DEFAULT_DSN ; // remove the default DSN
EndEnumeration
; ***************************************************************************************
Procedure.s AddDSN(databasename.s, user.s = "", pass.s = "", driver.s = "") ; Result DSN
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
; Databasename erzeugen (DSN)
name.s = GetFilePart(databasename)
name = Left(name.s, Len(name.s) - 4)
name = "Pure" + name
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "ACCESS", "MDB"
strDriver.s = "Microsoft Access Driver (*.mdb)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "EXCEL", "XLS"
strDriver.s = "Microsoft Excel Driver (*.xls)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "DBASE", "DBF"
strDriver.s = "Microsoft dBase Driver (*.dbf)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "TEXT", "TXT", "CSV"
strDriver.s = "Microsoft Text Driver (*.txt; *.csv)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Default
strDriver.s = driver
EndSelect
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
If result
ProcedureReturn name
Else
ProcedureReturn ""
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l RemoveDSN(databasename.s, user.s = "", pass.s = "", driver.s = "")
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
; Databasename erzeugen
name = GetFilePart(databasename)
name = Left(name, Len(name) - 4)
name = "Pure" + name
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "ACCESS", "MDB"
strDriver = "Microsoft Access Driver (*.mdb)"
Case "EXCEL", "XLS"
strDriver = "Microsoft Excel Driver (*.xls)"
Case "DBASE", "DBF"
strDriver = "Microsoft dBase Driver (*.dbf)"
Case "TEXT", "TXT", "CSV"
strDriver = "Microsoft Text Driver (*.txt; *.csv)"
Default
strDriver = driver
EndSelect
; Attributes zustellen
strAttributes = "DSN=" + name + ";"
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Procedure.s GetTables(Datenbank)
Protected hwnd.l, r1.l, len.l
Protected *buffer
Protected result.s
hwnd = PeekL(IsDatabase(Datenbank) + 4)
result.s = ""
If hwnd
r1 = SQLTables_(hwnd,0,0,0,0,0,0,0,0) & $FFFF
Debug r1
If r1 = 0 Or r1 = 1
*buffer = AllocateMemory(256)
SQLBindCol_(hwnd,3,1,*buffer,256,@len)
While SQLFetch_(hwnd) & $FFFF = 0
result + PeekS(*buffer, len) + ";"
Wend
FreeMemory(*buffer)
EndIf
EndIf
ProcedureReturn result
EndProcedure
;- Test
#Datenbank = 0
InitDatabase()
; ; Excel
; Path.s = "D:\Daten\PureBasic4\Database\TelefonListe.xls"
; ; DSN anlegen
; Base.s = AddDSN(Path)
;
; If Base
; Debug "DSN=" + Base
; If OpenDatabase(#Datenbank, Base, "", "")
; Debug GetTables(#Datenbank)
; sql.s = "Select * From [Tabelle1$]"
; If DatabaseQuery(#Datenbank, sql) ; Ermittelt alle Einträge in der 'employee' Tabelle
; Spalten = DatabaseColumns(#Datenbank) - 1
; temp.s = ""
; For Spalte = 0 To Spalten
; temp + DatabaseColumnName(#Datenbank, Spalte) + ";"
; Next
; Debug temp
; While NextDatabaseRow(#Datenbank) ; alle Einträge durchlaufen
; temp.s = ""
; For Spalte = 0 To Spalten
; temp + GetDatabaseString(#Datenbank, Spalte) + ";"
; Next
; Debug temp
; Wend
;
; EndIf
; EndIf
; EndIf
;
; DSN am Ende entfernen
;RemoveDSN(path, "", "")
;
; CSV
Path.s = "D:\Daten\PureBasic4\Database\Telefon.csv"
; DSN anlegen
Base.s = AddDSN(Path)
If Base
Debug "DSN=" + Base
If OpenDatabase(#Datenbank, Base, "", "")
sql.s = "Select * From " + path
If DatabaseQuery(#Datenbank, sql) ; Ermittelt alle Einträge in der 'employee' Tabelle
Spalten = DatabaseColumns(#Datenbank) - 1
temp.s = ""
For Spalte = 0 To Spalten
temp + DatabaseColumnName(#Datenbank, Spalte) + ";"
Next
Debug temp
While NextDatabaseRow(#Datenbank) ; alle Einträge durchlaufen
temp.s = ""
For Spalte = 0 To Spalten
temp + GetDatabaseString(#Datenbank, Spalte) + ";"
Next
Debug temp
Wend
Else
Debug DatabaseError()
EndIf
EndIf
EndIf
; DSN am Ende entfernen
RemoveDSN(path, "", "")

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Kleines Update
CSV Dateien sind nicht besonders gut für Datenbanken geeigned. Vielleicht DBF nehmen und mit "Create Table Dateiname (...)" die Tabellen erzeugen.
FF
Code: Alles auswählen
;-TOP
; Kommentar : DSN Helper
; Version : v1.02
; Author : Michael Kastner
; Datei : DsnHelper.pb
; Erstellt : 28.09.2006
; Geändert : 13.10.2006
; ***************************************************************************************
Enumeration 1
#ODBC_ADD_DSN ; // Add data source
#ODBC_CONFIG_DSN ; // Configure (edit) Data source
#ODBC_REMOVE_DSN ; // Remove data source
#ODBC_ADD_SYS_DSN ; // add a system DSN
#ODBC_CONFIG_SYS_DSN ; // Configure a system DSN
#ODBC_REMOVE_SYS_DSN ; // remove a system DSN
#ODBC_REMOVE_DEFAULT_DSN ; // remove the default DSN
EndEnumeration
; ***************************************************************************************
Procedure.s AddDSN(databasename.s, user.s = "", pass.s = "", driver.s = "") ; Result DSN
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
; Databasename erzeugen (DSN)
name.s = GetFilePart(databasename)
name = Left(name.s, Len(name.s) - 4)
name = "Pure" + name
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "ACCESS", "MDB"
strDriver.s = "Microsoft Access Driver (*.mdb)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "EXCEL", "XLS"
strDriver.s = "Microsoft Excel Driver (*.xls)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "DBASE", "DBF"
strDriver.s = "Microsoft dBase Driver (*.dbf)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + GetPathPart(databasename)
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "TEXT", "TXT", "CSV"
strDriver.s = "Microsoft Text Driver (*.txt; *.csv)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + GetPathPart(databasename)
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Default
strDriver.s = driver
EndSelect
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
If result
ProcedureReturn name
Else
ProcedureReturn ""
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l RemoveDSN(databasename.s, user.s = "", pass.s = "", driver.s = "")
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
; Databasename erzeugen
name = GetFilePart(databasename)
name = Left(name, Len(name) - 4)
name = "Pure" + name
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "ACCESS", "MDB"
strDriver = "Microsoft Access Driver (*.mdb)"
Case "EXCEL", "XLS"
strDriver = "Microsoft Excel Driver (*.xls)"
Case "DBASE", "DBF"
strDriver = "Microsoft dBase Driver (*.dbf)"
Case "TEXT", "TXT", "CSV"
strDriver = "Microsoft Text Driver (*.txt; *.csv)"
Default
strDriver = driver
EndSelect
; Attributes zustellen
strAttributes = "DSN=" + name + ";"
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Procedure.s GetTables(Datenbank)
Protected hwnd.l, r1.l, len.l
Protected *buffer
Protected result.s
hwnd = PeekL(IsDatabase(Datenbank) + 4)
result.s = ""
If hwnd
r1 = SQLTables_(hwnd,0,0,0,0,0,0,0,0) & $FFFF
Debug r1
If r1 = 0 Or r1 = 1
*buffer = AllocateMemory(256)
SQLBindCol_(hwnd,3,1,*buffer,256,@len)
While SQLFetch_(hwnd) & $FFFF = 0
result + PeekS(*buffer, len) + ";"
Wend
FreeMemory(*buffer)
EndIf
EndIf
ProcedureReturn result
EndProcedure
FF

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Wollte auch mal was posten
http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
Informationen.
Ist nur eine ,,Skizze,,
Kann gar nichts besonderes, und ist sicherlich auch nicht ideal umgesetzt.
Denke aber, Text erklärt sich von selbst und kann als Anfang für die Benutzung von CSV-Dateien dienen.
Hab meine CSVs mit OpenOffice 2.0 mit OpenCalc erstellt.
UTF8, Semikolon als Trennzeichen. Anführungszeichen bestehen aus dem Ding, was mit Umschalt (Shift) kommt, wenn man Raute drückt: '
Zu meiner Verteidigung: hab einfach mal drauf los programmiert, unterstützt als keine ,,Semikolons,, innerhalb einer Zelle.
Hatte vorher mich auch nicht weiter über CSV informiert.
Also ein bisschen experimentiert. Und mit Ablenkung durch Fernsehen ... ca. ne Stunde dran gesessen.
Gruß, Folker
Informationen.
Ist nur eine ,,Skizze,,
Kann gar nichts besonderes, und ist sicherlich auch nicht ideal umgesetzt.
Denke aber, Text erklärt sich von selbst und kann als Anfang für die Benutzung von CSV-Dateien dienen.
Hab meine CSVs mit OpenOffice 2.0 mit OpenCalc erstellt.
UTF8, Semikolon als Trennzeichen. Anführungszeichen bestehen aus dem Ding, was mit Umschalt (Shift) kommt, wenn man Raute drückt: '
Code: Alles auswählen
;/ Folker Linstedt Comma Separated Values
; UTF8
ReadFile(1,"*.csv")
;FileTyp=ReadStringFormat(1)
Zeile1.s=ReadString(1,#PB_UTF8)
Z.s=Left(Zeile1,1); Anfuehrungszeichen der CSV-Datei
Spalten = CountString(Zeile1, Z)/2
If Spalten>1
T.s=Mid(Zeile1,FindString(Zeile1, Z, 2)+1,1)
EndIf
Zeilen=0
While Not Eof(1)
Zeile.s=ReadString(1,#PB_UTF8)
Zeilen+1
Wend
CloseFile(1)
MessageRequester("Spalten: "+Str(Spalten)+" Zeilen: "+Str(Zeilen)+" Trennzeichen: "+T+" Anführungszeichen: "+Z,Zeile1)
Dim Tab.s(Spalten, Zeilen)
ReadFile(1,"*.csv")
For y=0 To Zeilen
Zeile.s=ReadString(1,#PB_UTF8)
For x=1 To Spalten
Tab(x,y) = StringField(Zeile,x,T)
Next
Next
CloseFile(1)
OpenConsole()
Print("Zelle (x,y): ")
SX.s=Input()
x=Val(StringField(SX,1,","))
y=Val(StringField(SX,2,","))
PrintN("Zelleninhalt: "+Tab(x,y))
Input()
CloseConsole()
Hatte vorher mich auch nicht weiter über CSV informiert.
Also ein bisschen experimentiert. Und mit Ablenkung durch Fernsehen ... ca. ne Stunde dran gesessen.
Gruß, Folker

Kinder an die Macht http://scratch.mit.edu/
Feedback
Vorab: erstmal herzlichen Dank für die Hilfe
Dieser Thementeil war sehr lehrreich. Kann ich Anderen nur empfehlen.
Es zeigt die Möglichkeiten, die man hat. In diesem Zusammenhang bin ich auch auf SQLite3 mit der dll gekommen. Habe mich letztendlich aber für die CSV-Variante entschieden wegen des Handling mit PHP (fgetcsv) später auf der Homepage. Besonders hilfreich war auch das Beispiel mit dem ODBC-Treiber, weil zufälligerweise meine Ursprungsdatei die Endung "*.xls" hatte, was ich aber zum Zeitpunkt der Anfrage nicht wußte. Ich bekam die Datei erst später zugesendet.
Erfolgreicher kann so ein Thread nicht sein. Einfach Super.
Dieser Thementeil war sehr lehrreich. Kann ich Anderen nur empfehlen.
Es zeigt die Möglichkeiten, die man hat. In diesem Zusammenhang bin ich auch auf SQLite3 mit der dll gekommen. Habe mich letztendlich aber für die CSV-Variante entschieden wegen des Handling mit PHP (fgetcsv) später auf der Homepage. Besonders hilfreich war auch das Beispiel mit dem ODBC-Treiber, weil zufälligerweise meine Ursprungsdatei die Endung "*.xls" hatte, was ich aber zum Zeitpunkt der Anfrage nicht wußte. Ich bekam die Datei erst später zugesendet.
Erfolgreicher kann so ein Thread nicht sein. Einfach Super.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9