Entwickler-Ecke

Dateizugriff - Inhalt eines Arrays in einen Paradox Tabelle schreiben?


NoEon - Mi 01.09.04 11:09
Titel: Inhalt eines Arrays in einen Paradox Tabelle schreiben?
Hallo, ich habe ein DynArray.


Ich weiss jetzt nicht welche abgaben man noch brauch dafür damit Ihr weiterhelfen könnt.
Einfach sagen! Ich lerne das alles gerade! Kann daher nicht allszuviel!

Ziel. bzw Vorgensweise:
Auslesen einer Datei (CSV) immer noch.
Diese wird in ein DynArray geschrieben.
Dann soll Zeilenweise meine Paradox Tabelle gefüllt werden mit dem Inhalt.


Ist das hier noch die richtige Kategorie?!


Gruss
Lars


jasocul - Mi 01.09.04 11:50

Hallo Lars,

ich schreib Dir hier keinen Source, sondern nur Hinweise, damit Du ein bisschen selber tüfteln musst. Das hilft beim lernen.

Auslesene einer Datei und ins Array schreiben:
Dateivariable definieren vom Typ Textfile
Datei zum lesen öffnen
über eine Schleife (bis eof) lesen
in der Schleife den eingelesenen String parsen und ins Array einlesen
Datei schließen.

Tabelle füllen:
Schleife über das Array
Für jede Arrayzeile ein Append auf Tabelle und jedem Feld die Daten zuweisen

Wenn Du weitere Hilfe brauchst, schreibe einfach an welcher Stelle Du nicht weiter kommst.


grayfox - Mi 01.09.04 12:10

hallo lars!

hier hast du eine 'einfache' routine zum einlesen eines csv-files in eine paradox-tabelle
feldtrennzeichen = ';', texterkennung gibts keine


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
{$UNTESTED, da einfach eingetippt}
var
  T: TextFile;
  instring: String;
  aTrennPos: ShortInt;
  aTempStr: String;
  Counter: LongInt;
  aFeldNr: ShortInt;
begin
  table1.Open;
  AssignFile(T,aFilename);
  Reset(T);
  Readln(T,instring);  // überschriften nicht miteinlesen
  aCounter:= 0;

  while not EOF(T) do begin
    readln(T,instring);
    instring:= instring + ';'  // damit auch das letzte feld eingelesen wird 
    inc(aCounter);
    if (aCounter mod 100)= 0 then begin
      StaticText1.Caption:= Format('SatzNr: %9d eingelesen',[aCounter]);
      StaticText1.Update
    end;

    aFeldNr:= 0;
    aTrennPos:= Pos(';',instring);
    table1.Append;
    while if aTrennPos > 0 do begin
      inc(aFeldNr);
      aTempStr:= Copy(instring,1,aTrennPos-1);
      table1.Fields[aFeldNr].Value:= aTempStr;
      Delete(instring,1,aTrennPos+1);
      aTrennPos:= Pos(';',instring)
    end
    table1.Post
  end;

  CloseFile(T);
  table1.close;

  StaticText1.Caption:= Format('SatzNr: %9d eingelesen',[aCounter]);
  StaticText1.Update;
  ShowMessage(Format('Import von %s beendet',[aFilename]));
end;


wozu du allerdings den umweg über ein array gehst, hab ich noch nicht verstanden...

mfg, stefan

//edit: das nächste mal tippe ich schneller ;)


NoEon - Mi 01.09.04 12:41

hi @ stefan,

sorry das mit dem Array ist ziemlich kompliziert... ich hab bis jetzt auch noch kein Plan warum ich das so gemacht habe un ddas Array darüber laufen lasse!
War eien Möglichkeit die ichausprobiert habe...


Das ist ne ziemlich heftige Sache für mich schon dieses Arry zu rallen..?! *doof schau*


Aber auf diese Art eine CSV zu importieren ist so ziemlich genau das was ich wollte..
Wenn ich das richtig gelesen habe, wird eine Tabelle zum Import erstellt?!
Oder wie läuft das?
Was ist wenn die Tabelle merh doer weniger Spalten hat als die CSV Datei?


Gruss
Lars


grayfox - Mi 01.09.04 12:53

hallo lars!

na, dann hab ich doch mal den daumen genau auf den nagel getroffen! ;)

Zitat:
wird eine Tabelle zum Import erstellt

nein, die tabelle muss schon bestehen - falls du eine neue tabelle erstellen willst (musst), dann --> [suchen] --> [CreateTable] bzw in der delphi-hilfe findest du auch ein beispiel dazu

Zitat:
Oder wie läuft das?

das prog iteriert durch das csv file, liest eine zeile ein, zerlegt sie in einzelfelder und befüllt die tabelle

Zitat:
Was ist wenn die Tabelle mehr doer weniger Spalten hat als die CSV Datei?

dann baust du die zerlegeroutine um ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    aFeldNr:= 0;  
    aTrennPos:= Pos(';',instring);  
    table1.Append;  
    while if aTrennPos > 0 do begin  
      inc(aFeldNr);  
      aTempStr:= Copy(instring,1,aTrennPos-1);
      case aFeldNr of
         1: table1.FieldByName('ID').asInteger:= StrToInt(aTempStr);
         2: table1.FieldByName('Bezeichnung').asString:= aTempStr;
         (* der 3. eintrag wird zb nicht in die tabelle eingetragen*)
         4: usw, usf....
      end
      Delete(instring,1,aTrennPos+1);  
      aTrennPos:= Pos(';',instring)  
    end  
    table1.Post


mfg, stefan


NoEon - Mi 01.09.04 13:21

hmm das klingt interessant!

Kannst Du öfter mal einen Blick auf dieses Postimg werfen?
Das wäre ziemlich genial.


Am genialsten wäre die Methode das ich mir diese CSV Datei nehme.
Daruaf hin die Headerspalte auslese und auf dieser Spalten Basis meine Paradox Tabelle bauen kann!

An dieser Stelle kommt wieder....
Wie geht das?!

Gruss
lars


NoEon - Mi 01.09.04 15:54

also,

ich muss ja die Tabellen erstellen, also mus ich zuerst wissen, wie viele Spalten hat die CSV Datei


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  T: TextFile;
  instring: String;
  aTrennPos: ShortInt;
  aTempStr: String;
  Counter: LongInt;
  aFeldNr: ShortInt;
  aFilename : string;
  aCounter: integer;
begin

with para_temp1 do begin
  Active := False;
  DatabaseName := 'import';
  TableType := ttParadox;
  TableName := 'para_temp1';

if not Table1.Exists then begin
      with FieldDefs do begin Clear

          CSV_Datei_Spalten.colcount :=  para_temp1.FieldCount;   // para_1.fieldcount;
          for i := 0 to CSV_Datei_Spalten.fieldcount  -0 do
            CSV_Datei_Spalten.cells[0,i] := para_temp1.fields[i].fieldname;


das wäre jetzt mein ansatz das sich an Stefans Beispiel mit den oben genannten Variablen anlehnt!
Es muss doch eine solche schleifduchlaufen oder bin ich auf dem Holzweg?

gruss
lars


grayfox - Mi 01.09.04 18:17

hallo lars!


Delphi-Quelltext
1:
2:
3:
4:
5:
  if not Table1.Exists then begin  
    with FieldDefs do begin 
      Clear;  

 -->  CSV_Datei_Spalten.colcount :=  para_temp1.FieldCount;


1. hat die csvdatei keine eigenschaft colcount...
2. ist die tabelle noch nicht erstellt, daher kann der table mit 'fieldcount' nicht viel anfangen

----------------------------------------------------------------------------------------
programmieren heisst auch denken und nicht nur bilderl herumschubsen ;)
----------------------------------------------------------------------------------------

1) womit sind die einzelnen felder im csv-file unterteilt?
die trennzeichen zählen könnte dich schon ein gutes stück weiterbringen

bitte, was ist das -->
Zitat:
CSV_Datei_Spalten.colcount

oder das -->
Zitat:
CSV_Datei_Spalten.cells[0,i]
[/code]

ist CSV_Datei_Spalten ein stringgrid?

2)
Zitat:
Es muss doch eine solche schleifduchlaufen

tu nicht schon herumschleifen, sondern überleg dir, woher du die feldbezeichnung, die feldtypen, längen, etc für deine tabelle nehmen willst *g*

mfg, stefan


grayfox - Mi 01.09.04 18:25

Zitat:
Daruaf hin die Headerspalte auslese und auf dieser Spalten Basis meine Paradox Tabelle bauen kann!

An dieser Stelle kommt wieder....
Wie geht das?!


du könntest dir zb ein eigenes csv-format erstellen
in der ersten zeile stehen die feldnamen, in der zweiten die feldtypen, usw...
es kommt nur drauf an, wie flexibel du beim import sein willst/musst.

normalerweise steht aber die tabellenstruktur fest und du kannst dir diese verrenkungen ersparen.

in meinen csm-dateien findest du in der ersten zeile die anzahl der zeilen und spalten
darunter die feldbezeichnungen und in der dritten zeile die breite der spalten im string-
grid, da ich damit vorwiegend mit stringgrids arbeite

mfg, stefan

ps: du darfst dir auch selbst löstungswege überlegen. schon klar, das man am beginn etliche leere kilometer zurücklegt, aber nur bekommt man dadurch mehr erfahrung, als wenn man vorgefertigte routinen übernimmt


NoEon - Fr 03.09.04 08:24

hi Stafan,

danke für die Anregungen, gedanklich bringen die mich ein ganzes Stück weiter.
Wie Du schon sagst "Erfahrung".

Auf fertige Routinen habe ich auch keine Lust.
Selber Hirnschmalz das find ich auch ok.

Nur mein Problem ist. Ich bin Azubi, sitze hier ganz alleine. Und von dem was ich hier mache hat niemand auch nur einen blassen schimmer!! D.H. ich sitz mit Delphi /Psacal hier alleine!
Keiner hilft, stellt Fragen oder gibt mal hilfestellungen!


Das ist ziemlich ätzend.
ich kann ja nicht mal schauen ob mein Lösungsansatz in die richtige Richtung geht.


Aso: zur Dynamischen erzeugung der Tabellen.
Ein eigenes Format wollte ich nicht entwickel, ich wollte mir die Option schaffen das alles Felder alphanummerisch sind und 255 Zeichen "vertragen"


Ich muss jetzt mal wieder reinkommen.
Gestern hatte ich ein Problem da sich nicht lösen kann.
Ein merkwüriger Debug Fehler! Kein Plan was Delphi von mir will! :-(

Wenn es was nützt dann stell ich das Programm mal zum Download zur verfügung?! Wegen des Fehlers!

Gruss
Lars