ASCII-dateiinhalt in verschiedene strings einlesen

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

Beitrag von dysti »

Nun ja,
ich bin mir da nicht ganz sicher, ob gedanklich @Purebasic09 tatsächlich ein Array vorgesehen hat, auch wenn es hier augenscheinlich sich hier so darstellt.
Auf jeden Fall klappt es so nicht. Hier stimmt der Programmierfluß vorn und hinten nicht.

@Kurzer, leider hast du wirlich zu kurz gedacht.
Wie soll das mit dem vordefinierten Array weiterlaufen?
In @Purebasic09 seiner Datenbasis besteht ein Artikel aus mehreren Einzelteilen. Er deutet das auch hierdurch an:

Code: Alles auswählen

Case  4 To 4000 
Das läuft ja auf eine Schleife hinaus.
Ein Array würde ich dann nicht nehmen, eher eine Linked List.

Das würde dann so aussehen:

Code: Alles auswählen

NewList teil.s()   
arbeitsver.s="I:/purebasic/datenbank/"        ; hier das richtige Verzeichnis angeben
If ReadFile(0, arbeitsver.s+"AUFTRAGE.PAU")   ; wenn die Datei geöffnet werden konnte, setzen wir fort...
  While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
    temp_s.s  = ReadString(0)      ; Zeile für Zeile im Debugger-Fenster anzeigen
    If Trim(temp_s) =  "PAU"
      zeilen.l = 1
    
    Else
      Select zeilen
        Case  1  : AddElement(teil()):teil() = temp_s : zeilen+1
        Case  2  : AddElement(teil()):teil() = temp_s : zeilen+1
        Case  3  : AddElement(teil()):teil() = temp_s : zeilen+1
        Case  4 To 4000
          If Not Trim(temp_s) =  "PAU-END"
          AddElement(teil()):teil() = StringField(temp_s,1,"|")
          AddElement(teil()):teil() = StringField(temp_s,2,"|")
          AddElement(teil()):teil() = StringField(temp_s,3,"|")
          AddElement(teil()):teil() = StringField(temp_s,4,"|")
          AddElement(teil()):teil() = StringField(temp_s,5,"|")
          zeilen+1
          EndIf
      EndSelect   
    EndIf
    
    If Trim(temp_s) =  "PAU-END"   
      ForEach teil()
      Debug teil()
      Next
      ClearList(teil()) 
    EndIf
    
    
  Wend
  CloseFile(0)               ; schließen der zuvor geöffneten Datei
Else
  MessageRequester("Information","Konnte Datei nicht öffnen!")
EndIf 
Die nächste Schwierigkeit ist das Wegschreiben der Daten in einer Datenbank.

Aber hier gibt sich @Purebasic09 bisher verschlossen.
Welche Datenbank will er benutzen?
Die von Purebasic allgemein unterstütze Dantenbank "SQLite"?
Wieviel Datensätze wird eine Datenbank ca. beinhalten?
Wie soll aber bei mehreren Einzelteilen die Relation gelöst werden, um die Datenbanktabellen möglichst klein zu halten und die Redundanz möglichst gering zu halten?
Dies bedarf einiger Antworten.

Warten wir erstmal auf Antworten von @Purebasic09 ab.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

Das frag ich mich auch, aber evtl. hat PureBasic09 noch mehr damit vor?
nein das hab ich nicht, denn das war nur zu zwecken, damit ich die ASCII-datei auslesen kann


@dysti ich verwende eine ODBC-Datenbank
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

dysti hat geschrieben: In @Purebasic09 seiner Datenbasis besteht ein Artikel aus mehreren Einzelteilen. Er deutet das auch hierdurch an:

Code: Alles auswählen

Case  4 To 4000 
mit dieser zeile bewirke ich nur, wieviele maximale zeilen er lesen soll
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

ich hab mal noch ne weitere frage:

ich habe in einigen dateien, die in die datenbank sollen, kommazahlen dabei.
diese werden aber standardmäßig aufgerundet. das soll aber nicht so sein, deswegen möchte ich diese nun per StrF() als fließkommazahl einbinden.

hab mir mal aus der hilfe den quellcode zusammengebastelt:

Code: Alles auswählen

Command$ = StrF(kont_zahl.f,3)
If DatabaseQuery(1,Command$)  
  While  NextDatabaseRow(1)  
    kont_zahl = Val(GetDatabaseString(1,0))
  Wend 
Else
EndIf
das problem ist aber das GetDatabaseString, denn ich bin mir net sicher ob das so sein muss
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ich schreibe es gerne für Dich noch einmal in fett:

[X] bitte Mehrfachpostings vermeiden!
Kaeru Gaman hat geschrieben:beachte bitte den [EDIT] Button oben rechts an deinem Posting.
PureBasic09 hat geschrieben:ich hab mal noch ne weitere frage: [...]
mein Tipp: konzentriere Dich doch erst einmal auf das fehlerfreie Auslesen
dieser PAU-Datei. Erst wenn Du das verstanden und umgesetzt hast, solltest
Du Dich an die Datenbank-Geschichte wagen.

Grüße ... Kiffi
a²+b²=mc²
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

so, das auslesen iss fertig

hab mich vorhin mit nem kollegen hingesetzt un nu gehts
hier der quellcode:

Code: Alles auswählen

P001_auslesen_auftrag: ;{
  If ReadFile(0, arbeitsver.s+"AUFTRAGE.PAU")   ; wenn die Datei geöffnet werden konnte, setzen wir fort...
    While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
      temp_s.s  = ReadString(0)      ; Zeile für Zeile im Debugger-Fenster anzeigen
      If Trim(temp_s) =  "PAU" 
        Gosub P001_Max_auftrag
        zeilen.l = 1 
      ElseIf Trim(temp_s) =  "PAU-END"    
      Else
        Select zeilen
          Case  1  : arbauf_DB.s(1,0) = temp_s : zeilen+1
          Case  2  : arbauf_DB.s(2,0) = temp_s : zeilen+1 
          Case  3  : arbauf_DB.s(3,0) = temp_s : zeilen+1  : Gosub P001_eintragen_kopf_auftrag 
          Case  4 To 4000 
            arbauf_DB(0,0) = temp_s
            arbauf_DB(4,0) = StringField(arbauf_DB(0,0),1,"|")
            arbauf_DB(5,0) = StringField(arbauf_DB(0,0),2,"|")
            arbauf_DB(6,0) = StringField(arbauf_DB(0,0),3,"|")
            arbauf_DB(7,0) = StringField(arbauf_DB(0,0),4,"|")
            arbauf_DB(8,0) = StringField(arbauf_DB(0,0),5,"|")
            Gosub P001_eintragen_haupt_auftrag
            zeilen+1 
        EndSelect   
      EndIf
    Wend
    CloseFile(0)               ; schließen der zuvor geöffneten Datei
  Else
    MessageRequester("Information","Konnte Datei nicht öffnen!")
  EndIf
  Return ;}


P001_Max_auftrag:;{
  command1$ = "select max(PAU_lnr) from arbauf_kopf_TEMP" 
  If DatabaseQuery(1, command1$)  
    While  NextDatabaseRow(1)  
      auftrag_max_ZN = Val(GetDatabaseString(1,0)) + 1
    Wend 
  Else
  EndIf       
  Return ;}


P001_eintragen_kopf_auftrag:;{
  If auftrag_max_ZN > 0 
    command.s = "INSERT INTO arbauf_kopf_TEMP (" 
    command.s + "  PAU_lnr"
    command.s + ", PAU_Nr"
    command.s + ", PAU_Bez"
    command.s + ", PAU_Dtm"
    command.s + " ) VALUES ("
    command.s + ""    + Str(auftrag_max_ZN) + " "
    command.s + ", '" + sonderzeichen(arbauf_DB.s(1,0))  +"' "  
    command.s + ", '" + sonderzeichen(arbauf_DB.s(2,0))  +"' " 
    command.s + ", '" + datumeng(arbauf_DB.s(3,0))  +"' " 
    command.s + ")"
    If DatabaseQuery(0,command) : While NextDatabaseRow(0) : Wend  : EndIf
  EndIf
  Return ;} 


P001_eintragen_haupt_auftrag: ;{
  If auftrag_max_ZN > 0 
    command.s = "INSERT INTO arbauf_haupt_TEMP (" 
    command.s + "  PAU_lnr"
    command.s + ", PAU_ZNr"
    command.s + ", PAU_PPR_Nr"
    command.s + ", PAU_Wstck"
    command.s + ", PAU_Art"
    command.s + ", PAU_Stckz"
    command.s + " ) VALUES ("

    command.s + ""    + Str(auftrag_max_ZN) +" "
    command.s + ",  " + arbauf_DB.s(4,0)    +" "  
    command.s + ", '" + sonderzeichen(arbauf_DB.s(5,0))  +"' " 
    command.s + ", '" + sonderzeichen(arbauf_DB.s(6,0))  +"' " 
    command.s + ",  " + arbauf_DB.s(7,0)  +" "  
    command.s + ",  " + arbauf_DB.s(8,0)  +" "   
    command.s + ")"
    If DatabaseQuery(0,command) : While NextDatabaseRow(0) : Wend  : EndIf
  EndIf
  Return ;}
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

PureBasic09 hat geschrieben:hab mich vorhin mit nem kollegen hingesetzt un nu gehts
hat er gut gemacht, Dein Kollege. ;-)

(bis auf die GOTOs, aber da will ich mal nicht so sein ;-))

Sag Deinem Kollegen noch, dass 'Insert', 'Update' und 'Delete' auf eine
Datenbank mit einem DatabaseUpdate(... durchgeführt werden sollen und
nicht mit DatabaseQuery(... .

Das nachfolgende While NextDatabaseRow(... kann dann auch weg.

Grüße ... Kiffi
a²+b²=mc²
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

gut, das hab ich geändert

aber kann mir jemand zu meiner inzwischen neuen frage helfen?

oder soll ich die frage in nem neuen thema posten?

also unabhängig von diesem hier?
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

dysti hat geschrieben:@Kurzer, leider hast du wirlich zu kurz gedacht.
Wie soll das mit dem vordefinierten Array weiterlaufen?
Keine Ahnung. Ich hätte das ganze eh anderes gecoded. :wink:
Ich habe durch meinen post nur einen Hinweis gegeben, wie man PureBasic09s Code zum laufen bringt. Nicht mehr und nicht weniger.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
PureBasic09
Beiträge: 33
Registriert: 16.06.2009 13:21
Wohnort: Sachsen

Beitrag von PureBasic09 »

2. Problem:
PureBasic09 hat geschrieben: ich hab mal noch ne weitere frage:

ich habe in einigen dateien, die in die datenbank sollen, kommazahlen dabei.
diese werden aber standardmäßig aufgerundet. das soll aber nicht so sein, deswegen möchte ich diese nun per StrF() als fließkommazahl einbinden.

hab mir mal aus der hilfe den quellcode zusammengebastelt:

Code: Alles auswählen

Command$ = StrF(kont_zahl.f,3)
If DatabaseQuery(1,Command$)  
  While  NextDatabaseRow(1)  
    kont_zahl = Val(GetDatabaseString(1,0))
  Wend 
Else
EndIf
das problem ist aber das GetDatabaseString, denn ich bin mir net sicher ob das so sein muss
[jaPBe] + [PB 4.31] + [MS Wind XP - SP3]
Antworten