;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ;| Titel....: Tab-Getrennte Tabellen ;| Datei....: TabTable.pbi ;| Datum....: 26.07.2008 ;| Inhalt...: * Proceduren zum Auslesen einer Datei in From eine mit Tabs getrennten Tabelle ;|________________________________________________________________________________________________ ; Vorrausgesetzte Includes ; Konstanten ; Tabellenstruktur Structure TablePBI *Position maxColumn.l maxRow.l Column.l Row.l EndStructure Global Dim TablePBI.TablePBI(0) ; Liest eine Datei in den Speicher Procedure LoadTable(Table, FileName$) If ReadFile(Table, FileName$) If Not Table < PeekL(@TablePBI()-8) ReDim TablePBI.TablePBI(Table) EndIf NewList Zeile.s() Repeat String$ = ReadString(Table) If String$ AddElement(Zeile()) Zeile() = String$ EndIf Until Eof(Table) CloseFile(Table) TablePBI(Table)\maxColumn = CountString(Zeile(),#TAB$) TablePBI(Table)\maxRow = CountList(Zeile())-1 Size = (TablePBI(Table)\maxColumn+1)*(TablePBI(Table)\maxRow+1) * 4 TablePBI(Table)\Position = AllocateMemory(Size) ForEach Zeile() For i = 0 To TablePBI(Table)\maxColumn Feld$ = StringField(Zeile(), i+1, #TAB$) *Pointer = AllocateMemory(Len(Feld$)+1) PokeS(*Pointer, Feld$) Position = TablePBI(Table)\Position + (i+ListIndex(Zeile())*(TablePBI(Table)\maxColumn+1))*4 PokeL(Position, *Pointer) Next Next TablePBI(Table)\Column = 0 TablePBI(Table)\Row = 0 ProcedureReturn #True EndIf EndProcedure ; Gibt den Speicher wieder frei in dem eine Tabelle gespeichert wurde Procedure FreeTable(Table) For Row = 0 To TablePBI(Table)\maxRow For Column = 0 To TablePBI(Tabelle)\maxColumn Position = TablePBI(Table)\Position + (Column+Row*(TablePBI(Table)\maxColumn+1))*4 FreeMemory(PeekL(Position)) Next Next FreeMemory(TablePBI(Table)\Position) ProcedureReturn #True EndProcedure ; Setzt die Tabelle zurück vor die erste Zeile Procedure ResetTableRow(Table, Row=0) TablePBI(Table)\Row = Row EndProcedure ; Setzt die Tabelle auf die nächste Zeile Procedure NextTableRow(Table) If TablePBI(Table)\Row < TablePBI(Table)\maxRow TablePBI(Table)\Row + 1 ProcedureReturn #True EndIf EndProcedure ; Setzt die Tabelle zurück vor die erste Spalte Procedure ResetTableColumn(Table, Column=0) TablePBI(Table)\Column = Column EndProcedure ; Setzt die Tabelle auf die nächste Spalte Procedure NextTableColumn(Table) If TablePBI(Table)\Column < TablePBI(Table)\maxColumn TablePBI(Table)\Column + 1 ProcedureReturn #True EndIf EndProcedure ; Gibt den Eintrag des aktuellen (oder des angegebenen) Feldes zurück Procedure.s GetTableField(Table, Row=-1, Column=-1) If Row = -1 Row = TablePBI(Table)\Row EndIf If Column = -1 Column = TablePBI(Table)\Column EndIf Position = TablePBI(Table)\Position + (Column+Row*(TablePBI(Table)\maxColumn+1))*4 ProcedureReturn PeekS(PeekL(Position)) EndProcedure ; Setzt die Tabelle auf die nächste Spalte und Gibt den Eintrag des aktuellen Feldes zurück Procedure.s GetNextTableField(Table) If NextTableColumn(Table) ProcedureReturn GetTableField(Table) EndIf EndProcedure ; Gibt die Nummer der aktuellen Spalte zurück Procedure GetTableColumn(Table) ProcedureReturn TablePBI(Table)\Column EndProcedure ; Gibt den Spaltennamen der aktuellen (oder der angegebenen) Spalte zurück Procedure.s GetTableColumnName(Table, Column=-1) ProcedureReturn GetTableField(Table, 0, Column) EndProcedure ; Gibt die Nummer der aktuellen Zeile zurück Procedure GetTableRow(Table) ProcedureReturn TablePBI(Table)\Row EndProcedure ; Gibt die Zeilennnamen der aktuellen (oder der angegebenen) Zeile zurück Procedure.s GetTableRowName(Table, Row=-1) ProcedureReturn GetTableField(Table, Row, 0) EndProcedure ; IDE Options = PureBasic 4.20 (Windows - x86) ; CursorPosition = 4 ; Folding = ----