BDFfont
u_CSV_File.pas
Classes | Body Source
Handle Comma-Separated Values files

The CSV file is read line by line to limit the amount of memory used by this unit. Default separator is char ',' (comma) Copyright TridenT 2003 - Under GNU GPL licence

Todo
Use TStringList to only load a part of the CSV file, and handle the loading-window
Author
TridenT
Version
2003/08/11 TridenT v1.0 Initial revision
Body Source
{-------------------------------------------------------------------------------
  Handle Comma-Separated Values files

  The CSV file is read line by line to limit the amount of memory used by this
  unit. Default separator is char ',' (comma)
  Copyright TridenT 2003 - Under GNU GPL licence

  @Author    TridenT
  @Version   2003/08/11   TridenT   v1.0     Initial revision
  @Todo      Use TStringList to only load a part of the CSV file, and handle
             the loading-window
-------------------------------------------------------------------------------}

unit u_CSV_File;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type

  // CSV Support file
  TCSV_File = class
  private
    CSVFile: TextFile;
    FileName: string;
    FValueList: TStringList;
    FSeparator: char;
    procedure SetSeparator(const ch: char);
  published
    property ValueList: TStringList read FValueList;
    property Separator: char read FSeparator write SetSeparator;
  public
    function Open(const CSVFileName: string): integer;
    procedure Close;
    function isEOF: boolean;
    function ReadNextLine: integer;
    procedure Find(const st: string);
  end;

implementation

{-------------------------------------------------------------------------------
 Open CSV file (read only) and initialize the class.
 You must open a file before calling other method (ReadNextLine or Find)
 At the end of the process, call Close method.

 @param      CSVFileName       Name of the CVS file to open
 @return     integer           0 if succesfull, -1 otherwise
-------------------------------------------------------------------------------}
function TCSV_File.Open(const CSVFileName: string): integer;
begin
  // Test if file exist
  if FileExists(CSVFileName) then
  begin
    FileName := CSVFileName;
    AssignFile(CSVFile, CSVFileName);
    FileMode := 0; // Read Only
    Reset(CSVFile);
    // Initialize Value list
    FValueList := TStringList.Create;
    Separator  := ',';
    Result     := 0;
  end
  else
    Result := -1;
end;

// Close a CVS file
procedure TCSV_File.Close;
begin
  // Close file
  System.CloseFile(CSVFile);
  FreeAndNil(FValueList);
end;

// Set CVS file separator.
procedure TCSV_File.SetSeparator(const ch: char);
begin
  if ch <> '' then FSeparator := ch;
end;

// Test end of file
function TCSV_File.isEOF: boolean;
begin
  Result := System.EOF(CSVFile);
end;

{-------------------------------------------------------------------------------
 Read next line and extract values
 @return     integer           Number of Values reads. Values are accessible
                               with <code> FValueList </code>
-------------------------------------------------------------------------------}
function TCSV_File.ReadNextLine: integer;
var
  ResultLine, Line: string;
  Pos_S: integer;
begin
  FValueList.Clear;
  Result := 0;
  // Read value line
  ReadLn(CSVfile, Line);
  // Parsing line
  while Line <> '' do
  begin
    Pos_S := Pos(Separator, Line);
    if Pos_S = 1 then
      // delete separator
      Delete(Line, Pos_S, 1)
    else
    begin
      // Test if separator found
      if Pos_S <> 0 then
      begin
        // Isolate value
        ResultLine := Copy(Line, 1,Pos_S - 1);
        // kill substring
        Delete(Line, 1,Pos_S);
      end
      else
      // if no more separator
      begin
        ResultLine := Line;
        Line       := '';
      end;
      FValueList.Add(ResultLine);
      Inc(Result);
    end;
  end;
end;

// Find a string in file
procedure TCSV_File.Find(const st: string);
var
  isFound: boolean;
begin
  isFound := False;
  while not isFound do
    if ReadNExtLine <> 0 then isFound := (St = FValueList[0]);
end;

end.
Classes
Class Description
TCSV_File CSV Support file
Links

Created with a demo version of Doc-O-Matic. This version is supplied for evaluation purposes only, do not distribute this documentation. To obtain a commercial license please see http://www.doc-o-matic.com/purchase.html.
Copyright (c) 2003. All rights reserved.