Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme. (https://www.delphipraxis.net/195855-hat-jemand-eine-ahnung-wie-ich-diese-datei-ein-stringgrid-bekomme.html)

verkouter 1. Apr 2018 16:32

Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich schreibe zur Zeit ein Programm, das Messprotokolle auswertet. Dabei bekomme ich von einem Aufzeichnungsgerät diese angehängte Dateien.
Mit Excel bekomme ich sie ohne Probleme, in eier Tabellenstruktur geöffnet. Es ist aber keine CSV-Datei. Bis jetzt lade ich sie über Excel in ein Stringgrid, entnehme für mich nötige Informationen und füge diese in ein Listview. Das dauert bei 2000 Dateien aber ewig lange. Andere Messdateien die in CSV vorliegen kann ich direkt ins Stringgrid laden, das
dauert nur ein paar Sekunden.

Delphi-Quellcode:
function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    x := XLApp.ActiveCell.Row;
    y := XLApp.ActiveCell.Column;
    AGrid.RowCount := x;
    AGrid.ColCount := y;
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    RangeMatrix := Unassigned;
  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

Ghostwalker 1. Apr 2018 16:40

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Das ist schon eine CSV. Spaltentrenner sieht nach einem Tab-Zeichen aus :)

verkouter 1. Apr 2018 17:25

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Mit dieser Funktion öffne ich die anderen Messdateien

Delphi-Quellcode:
procedure tform1.LoadCSV(Filename: string; sg: TStringGrid);
var
  i, j, Position, count, edt1: integer;
  temp, tempField : string;
  FieldDel: char;
  Data: TStringList;
begin
  Data := TStringList.Create;
  FieldDel := ';';
  Data.LoadFromFile(Filename);
  temp := Data[1];
  count := 0;
  for i:= 1 to length(temp) do
    if copy(temp,i,1) = FieldDel then
      inc(count);
  edt1 := count+1;
  sg.ColCount := 30;
  sg.RowCount := Data.Count +1;
  sg.FixedCols := 0;
  for i := 0 to Data.Count - 1 do
  begin;
    temp := Data[i];
    if copy(temp,length(temp),1) <> FieldDel then
      temp := temp + FieldDel;
    while Pos('"', temp) > 0 do
    begin
      Delete(temp,Pos('"', temp),1);
    end;
    for j := 1 to edt1 do
    begin
      Position := Pos(FieldDel,temp);
      tempField := copy(temp,0,Position-1);
      sg.Cells[j-1,i+1] := tempField;
      Delete(temp,1,length(tempField)+1);
    end;
  end;
  Data.Free;
end;
bei dieser Datei erhalte ich die Fehlermeldung "Listenindex überschreitet das Maximum".

Delphi.Narium 1. Apr 2018 17:48

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Nö, das ist kein CSV und Tabs kommen dadrin auch nicht vor.

Das ist 'ne ordinäre DBase-Datei.

Entweder mit der BDE (Achtung arg veraltet) TTable, TDataSource ... verarbeiten.

Dann kann man die Daten statt in 'nem StringGrid in 'nem TDBGrid anzeigen und wie eine Datenbanktabelle verarbeiten.

Oder TDBF nutzen. Das ist eine Delphikomponenten zum Zugriff auf DBase-Dateien. Sollte mit Deinen Dateien problemlos umgehen können und kann via TDataSource ... auch wie 'ne Datenbanktabelle genutzt werden.

Die Felder der Tabelle sind ID, LFDNR, P, Q und Flags, alles nummerische.

Wenn's eher händisch sein soll, dann die ersten 193 Byte (DBase-Header) überlesen.
Anschließend ergeben jeweils 59 Byte die Werte eines "Datensatzes", sie sind linksbündig mit Leerzeichen aufgefüllt.

Löschkennzeichen = Byte 1, wenn * dann Löschkennzeichen gesetzt, sonst nicht.
ID = Byte 2 bis 7 (Integer)
LFDNR = Byte 8 bis 13 (Integer)
P = Byte 14 bis 33 (Fließkomma)
Q = Byte 34 bis 53 (Fließkomma)
FLAGS = Byte 54 bis 59 (Integer)

Das letzte Byte der Datei darf getrost ignoriert werden, heißt halt nur: "Hier ist die Datei zu Ende".

verkouter 1. Apr 2018 19:43

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Würde es gern ohne zusätzliche Komponente machen. Was aber nicht, wie ich das aufsplitten soll.

KodeZwerg 1. Apr 2018 19:52

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Delphi.Narium schrieb doch eine Anleitung wie Du die Datensätze ohne Zusatz Komponente reinladen kannst, wofür ich mal eben Applaus gebe :)

Delphi.Narium 1. Apr 2018 20:01

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Ich habe Dir sehr ausführlich beschrieben, wie die Daten aufzuteilen sind.

Welche Bytes am Anfang zu überlesen sind, welches am Ende zu ignorieren ist und wie die einzelen Datensätze "dazwischen" aufzuteilen sind.

BlockRead könnte da eine Methode sein, die beim Lesen der Daten hilft.

hoika 1. Apr 2018 20:04

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Hallo
zum Aufsplitten nehme ich immer eine zweite TStringList.

KodeZwerg 1. Apr 2018 20:13

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
Ich würd's eher mit dem vielfachen von 59 Bytes puffern und intern splitten, geht schneller als dauernd BlockRead() anzuwenden, oder lieg ich wieder falsch?
[EDIT]
Abzüglich der ersten 193 Bytes natürlich, also ab File-Offset 193.
Menno, BlockRead() kann man ja so nutzen, ich hatte TStream im Kopf als Lese-Methode, also beides geht will ich damit sagen, sorry!
[/EDIT]

himitsu 1. Apr 2018 20:51

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
 
TDBGrid + ClientDataSet/MemoryDataSet und z.B. https://www.delphipraxis.net/164041-...ntdataset.html
Aber da es eh keine CSV ist, bleibt es beim DBGrid :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz