![]() |
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; |
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 :)
|
AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
Mit dieser Funktion öffne ich die anderen Messdateien
Delphi-Quellcode:
bei dieser Datei erhalte ich die Fehlermeldung "Listenindex überschreitet das Maximum".
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; |
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 ![]() 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". |
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.
|
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 :)
|
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. ![]() |
AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
Hallo
zum Aufsplitten nehme ich immer eine zweite TStringList. |
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] |
AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.
TDBGrid + ClientDataSet/MemoryDataSet und z.B.
![]() Aber da es eh keine CSV ist, bleibt es beim DBGrid :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz