Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#3

AW: Grid, Listview oder was auch immer nehmen

  Alt 7. Nov 2018, 16:21
Unter groß kann man sich viel vorstellen. Eine CSV mit ca. 36000 Zeilen wird in ca. 300ms eingelesen und dann fix präsentiert.

(Kann man insgesamt auch schöner machen - aber für eine Demo reicht es ja)
Delphi-Quellcode:
unit CsvViewer.Classes;

interface

uses
  System.Classes, System.SysUtils, System.Generics.Collections,
  Data.DB,
  Datasnap.DBClient,
  Spring; // ACHTUNG! Spring4D wird benötigt!

type
  TCsvContent = class( TList < TArray < string >> )
  private
    FHeader: TArray<string>;
    FHasHeader: Boolean;
  public
    property Header: TArray<string> read FHeader write FHeader;
    property HasHeader: Boolean read FHasHeader write FHasHeader;
  end;

  TCsvReader = class
  public const
    DefaultBufferSize = 4096;
    DefaultDetectBOM = false;
    DefaultQuoteChar = Char( '"' );
    DefaultSeparatorChar = Char( ',' );
  private
    FQuoteChar: Char;
    FSeparatorChar: Char;
    FEncoding: TEncoding;
    FDetectBOM: Boolean;
    FBufferSize: Integer;
    FFirstRowContainsHeader: Boolean;
  public
    constructor Create;

    property BufferSize: Integer read FBufferSize write FBufferSize;
    property DetectBOM: Boolean read FDetectBOM write FDetectBOM;
    property Encoding: TEncoding read FEncoding write FEncoding;
    property FirstRowContainsHeader: Boolean read FFirstRowContainsHeader write FFirstRowContainsHeader;
    property QuoteChar: Char read FQuoteChar write FQuoteChar;
    property SeparatorChar: Char read FSeparatorChar write FSeparatorChar;

    function Read( const Filename: TFilename ): IShared<TCsvContent>;
  end;

implementation

{ TCsvReader }

constructor TCsvReader.Create;
begin
  inherited;

  FBufferSize := DefaultBufferSize;
  FDetectBOM := DefaultDetectBOM;
  FEncoding := TEncoding.UTF8;
  FQuoteChar := DefaultQuoteChar;
  FSeparatorChar := DefaultSeparatorChar;
end;

function TCsvReader.Read( const Filename: TFilename ): IShared<TCsvContent>;
var
  streamReader: IShared<TStreamReader>;
  line: string;
  stringList: IShared<TStringList>;
  firstRow: Boolean;
  I: Integer;
  Header: TArray<string>;

  function ReadNextLine( ): Boolean;
  var
    separatorCharCount: Integer;
  begin
    line := string.Empty;
    while not streamReader.EndOfStream do
      begin
        line := line + streamReader.ReadLine( );
        separatorCharCount := line.CountChar( QuoteChar );
        if separatorCharCount mod 2 = 0
        then
          Exit( True );
      end;
    Result := false;
  end;

begin
  Result := Shared.New( TCsvContent.Create( ) );

  streamReader := Shared.New( TStreamReader.Create( Filename, Encoding, DetectBOM, BufferSize ) );

  stringList := Shared.New( TStringList.Create );
  stringList.QuoteChar := QuoteChar;
  stringList.Delimiter := SeparatorChar;
  stringList.StrictDelimiter := True;

  firstRow := True;

  while ReadNextLine( ) do
    begin
      stringList.DelimitedText := line;

      if firstRow
      then
        try

          if FirstRowContainsHeader
          then
            begin
              Result.Header := stringList.ToStringArray( );
              Result.HasHeader := True;

              Continue;
            end;
        finally
          firstRow := False;
        end;

      Result.Add( stringList.ToStringArray( ) );
    end;
end;

end.
und die Form
Delphi-Quellcode:
unit CsvCiewer.Forms.MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.Actions,
  System.ImageList, System.Diagnostics,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls,
  Vcl.ActnList, Vcl.StdActns, Vcl.ImgList, Vcl.ToolWin,
  Spring, CsvViewer.Classes;

type
  TMainForm = class( TForm )
    ListView1: TListView;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ActionList1: TActionList;
    ImageList1: TImageList;
    FileOpen1: TFileOpen;
    StatusBar1: TStatusBar;
    procedure FileOpen1_Accept( Sender: TObject );
    procedure ListView1_Data( Sender: TObject; Item: TListItem );
  private
    FCsvReader: IShared<TCsvReader>;
    FCsvContent: IShared<TCsvContent>;
  public
    procedure AfterConstruction; override;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}
{ TMainForm }

procedure TMainForm.AfterConstruction;
begin
  inherited;
  FCsvReader := Shared.New( TCsvReader.Create );
  FCsvReader.FirstRowContainsHeader := True;
end;

procedure TMainForm.FileOpen1_Accept( Sender: TObject );
var
  col: TListColumn;
  loadingStopwatch, presentingStopwatch: TStopwatch;
begin
  loadingStopwatch := TStopwatch.StartNew( );

  FCsvContent := FCsvReader.Read( FileOpen1.Dialog.FileName );

  loadingStopwatch.Stop( );

  presentingStopwatch := TStopwatch.StartNew();

  ListView1.Items.BeginUpdate( );
  try

    ListView1.Items.Count := 0;
    ListView1.Columns.Clear;

    while ListView1.Columns.Count < Length( FCsvContent.Items[0] ) do
      begin
        col := ListView1.Columns.Add;

        if FCsvContent.HasHeader
        then
          col.Caption := FCsvContent.Header[col.Index]
        else
          col.Caption := 'Field ' + ( col.Index + 1 ).ToString( );
      end;

    ListView1.Items.Count := FCsvContent.Count;
  finally
    ListView1.Items.EndUpdate( );
  end;

  presentingStopwatch.Stop();

  StatusBar1.SimpleText := loadingStopwatch.ElapsedMilliseconds.ToString() + 'ms - '+presentingStopwatch.ElapsedMilliseconds.ToString()+'ms';
end;

procedure TMainForm.ListView1_Data( Sender: TObject; Item: TListItem );
var
  rowData: TArray<string>;
  idx: Integer;
begin
  rowData := FCsvContent.Items[Item.Index];

  Item.Caption := rowData[0];

  for idx := 1 to High( rowData ) do
    begin
      Item.SubItems.Add( rowData[idx] );
    end;
end;

end.
und die dfm zur Form
Delphi-Quellcode:
object MainForm: TMainForm
  Left = 0
  Top = 0
  Caption = 'MainForm'
  ClientHeight = 411
  ClientWidth = 852
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ListView1: TListView
    Left = 0
    Top = 29
    Width = 852
    Height = 363
    Align = alClient
    Columns = <>
    OwnerData = True
    ReadOnly = True
    RowSelect = True
    TabOrder = 0
    ViewStyle = vsReport
    OnData = ListView1_Data
    ExplicitTop = 35
    ExplicitHeight = 382
  end
  object ToolBar1: TToolBar
    Left = 0
    Top = 0
    Width = 852
    Height = 29
    Caption = 'ToolBar1'
    Images = ImageList1
    TabOrder = 1
    ExplicitLeft = 360
    ExplicitTop = 208
    ExplicitWidth = 150
    object ToolButton1: TToolButton
      Left = 0
      Top = 0
      Action = FileOpen1
    end
  end
  object StatusBar1: TStatusBar
    Left = 0
    Top = 392
    Width = 852
    Height = 19
    Panels = <>
    ExplicitLeft = 432
    ExplicitTop = 216
    ExplicitWidth = 0
  end
  object ActionList1: TActionList
    Images = ImageList1
    Left = 496
    Top = 200
    object FileOpen1: TFileOpen
      Category = 'File'
      Caption = #214'&ffnen...'
      Dialog.DefaultExt = '.csv'
      Dialog.Filter = 'CSV-Dateien (*.csv)|*.csv'
      Hint = #214'ffnen|Vorhandene Datei '#246'ffnen'
      ImageIndex = 0
      ShortCut = 16463
      OnAccept = FileOpen1_Accept
    end
  end
  object ImageList1: TImageList
    Left = 568
    Top = 208
    Bitmap = {
      494C010101000500040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
      0000000000003600000028000000400000001000000001002000000000000010
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000008080000080
      8000008080000080800000808000008080000080800000808000008080000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000FFFF00000000000080
      8000008080000080800000808000008080000080800000808000008080000080
      8000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000FFFFFF0000FFFF000000
      0000008080000080800000808000008080000080800000808000008080000080
      8000008080000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
      FF00000000000080800000808000008080000080800000808000008080000080
      8000008080000080800000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF
      FF0000FFFF000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
      FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF
      FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
      FF00000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000424D3E000000000000003E000000
      2800000040000000100000000100010000000000800000000000000000000000
      000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000
      001F000000000000000F00000000000000070000000000000003000000000000
      00010000000000000000000000000000001F000000000000001F000000000000
      001F0000000000008FF1000000000000FFF9000000000000FF75000000000000
      FF8F000000000000FFFF000000000000}

  end
end
  Mit Zitat antworten Zitat