CVS-Texteinträge sortieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

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?????
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@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 :allright:

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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> P.S. ich habe aber noch probleme wenn in sql dir die Datei (mit Path) ein
> leerzeichen beinhaltet.

vielleicht klappt's mit dem DOS-Namen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

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
Habe nachgesehen. Es gibt unter den Reiter "Treiber" einen Eintrag "*.CSV".
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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

DB-Helper

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, "", "")

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Oh,toll, werde es gleich ausprobieren.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Kleines Update

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
CSV Dateien sind nicht besonders gut für Datenbanken geeigned. Vielleicht DBF nehmen und mit "Create Table Dateiname (...)" die Tabellen erzeugen.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Wollte auch mal was posten

Beitrag von Xaby »

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: '

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()
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 :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Feedback

Beitrag von dysti »

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.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten