Entwickler-Ecke

Dateizugriff - Fehler beim Import


NoEon - Mi 08.09.04 09:28
Titel: Fehler beim Import
Hallo Ng's

da gibts was...
und zwar..
Import CSV in Paradox Tabelle // leidiges Thema ich weiss//

Aber umso wichtiger für mich. ;-)

Ich kann meine CSV Datei importieren wohin ich will, das ist ekin Problem.

Doch jetzt kommts, die Warenwirtschaft ist so "toll" das sie in einigen Langtexten un Anderen Felden ";" meinen Feldseperator mal einfach drinne hat
Das heisst das dann der String schon an dieser Stelle abgeschnitten wird.
Das ist ziemlich doof. Weil so kann ich keine 4300 Datensätze Fehlerfrei Importieren. wie kann ich das umgehen.

Mir fehlt der Gedankliche Ansatz!

Help!

Gruss
Lars

Mein Code sieht so aus..

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:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
procedure TForm1.Button1Click(Sender: TObject);
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';  }

  table1.Open;
  if opendialog1.Execute()
    then
      aFilename := openDialog1.FileName ;
  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 aTrennPos > 0 do begin
      inc(aFeldNr);
      aTempStr:= Copy(instring,1,aTrennPos-1);
      table1.Fields[aFeldNr].AsString := aTempStr;
      Delete(instring,1,aTrennPos);
      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;

end.


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.


smiegel - Mi 08.09.04 11:16

Hallo,

erzeugst Du die Importdatei selbst oder wird sie Dir zur Verfügung gestellt?

Was spricht dagegen, die einzelnen Felder durch ein Tab oder ein anderes Zeichen zu trennen, das nicht im Feldinhalt vorkomnmt? Oder, die einzelnen Feldinhalte in Anführungszeichen zu setzen?


NoEon - Mi 08.09.04 13:14

es ist so das ich die Datei zur Verfügung gestellt bekomme. Allerdings als Excel, und ich muss mir erst die CSV datei draus machen um sie einzulesen.


wie wäre es besser.? Kann ich Excel Sagen das er mir n anderes Feld-Trennerzeichen geben soll?!

Wenn ich mir das mal anschaue dann ist es Sinnvoll die Texte in "" zu fassen... hmm wie mach ich das den in dem Text den ich habe?!
Einfach austauschen?!

gruss
lars


grayfox - Mi 08.09.04 17:46

hallo lars!

Zitat:
Allerdings als Excel, und ich muss mir erst die CSV datei draus machen um sie einzulesen.


dann hat du ja ohnehin die ganze import-file-steuerung in deiner hand
- einfach das ganze arbeitsblatt markieren - ersetzen strichpunkt durch zb beistrich

ich kenne nur beim import die möglichkeit, die trennzeichen auszuwählen, beim export muss ich passen.

Zitat:
Wenn ich mir das mal anschaue dann ist es Sinnvoll die Texte in "" zu fassen

wozu? gefällt dir das, wenn zb die artikelbezeichnung in anführungszeichen steht?
vor allem bei textfeldern, die genau auf die benötigte länge zugeschnitten sind, kommt dann immer freude bei
führenden anführungszeichen auf :D


Delphi-Quelltext
1:
tmpText:= copy(ImportText,2,Length(ImportText)-2)                    

und schon passt es wieder ;)

mfg, stefan