unit MainUnit;
interface
{$ifdef VER140}
{$define DELPHI6_UP}
{$endif}
{$ifdef VER150}
{$define DELPHI6_UP}
{$endif}
{$ifdef VER160}
{$define DELPHI6_UP}
{$endif}
{$ifdef VER170}
{$define DELPHI6_UP}
{$endif}
{$ifdef VER180}
{$define DELPHI6_UP}
{$define BDS2006_UP}
{$endif}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TMainForm =
class(TForm)
TopPanel: TPanel;
lbxRecords: TListBox;
Splitter: TSplitter;
lbxFields: TListBox;
Label1: TLabel;
FileEdit: TEdit;
btnPickFile: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
stLineNo: TStaticText;
stLineCount: TStaticText;
stFieldCount: TStaticText;
stFieldNo: TStaticText;
gbParsing: TGroupBox;
rbCustom: TRadioButton;
rbCommaText: TRadioButton;
rbDelimitedText: TRadioButton;
Label6: TLabel;
DelimEdit: TEdit;
Label7: TLabel;
QuoteEdit: TEdit;
btnOpen: TButton;
OpenDialog: TOpenDialog;
NewlineEdit: TEdit;
Label8: TLabel;
cbEatWhitespace: TCheckBox;
cbStrictDelimiter: TCheckBox;
procedure btnPickFileClick(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure lbxRecordsClick(Sender: TObject);
procedure lbxFieldsClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FDelim:
String;
FQuote:
String;
FNewline:
String;
procedure ResetDisplay;
procedure ParseRecord;
procedure UpdateFieldNo;
function OptionToText(S:
String):
String;
function TextToOption(S:
String):
String;
public
{ Public declarations }
published
procedure ParseOptionChange(Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses llCSV;
function TMainForm.OptionToText(S:
String):
String;
var
i: Integer;
begin
Result := S;
if (Length(S) = 1)
then begin
i := Ord(S[1]);
if (i < 32)
or (i > 127)
then
Result := Format('
%.3d', [i]);
end;
end;
function TMainForm.TextToOption(S:
String):
String;
var
i: Integer;
begin
Result := S;
if Length(S) = 3
then begin
i := StrToIntDef(S, 0);
if (i
mod 256 = i)
and (Format('
%.3d', [i]) = S)
then
Result := Chr(i);
end;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
{$ifndef DELPHI6_UP}
rbDelimitedText.Enabled := False;
{$endif}
{$ifdef BDS2006_UP}
cbStrictDelimiter.Enabled :=
not rbCustom.Checked;
cbStrictDelimiter.Checked := lbxFields.Items.StrictDelimiter;
{$else}
cbStrictDelimiter.Enabled := False;
{$endif}
ResetDisplay;
DelimEdit.Text := OptionToText(DefaultDelim);
QuoteEdit.Text := OptionToText(DefaultQuote);
NewlineEdit.Text := OptionToText(DefaultNewline);
// Associate me with CSV files if you don't have Excel!
if ParamCount > 0
then begin
FileEdit.Text := ParamStr(1);
btnOpenClick(Sender);
end;
end;
procedure TMainForm.ResetDisplay;
begin
lbxRecords.Clear;
lbxFields.Items.Text := '
Copyright ©2007 Ray Marron - www.raymarron.com';
stLineCount.Caption := '
-';
stLineNo.Caption := '
-';
stFieldCount.Caption := '
-';
stFieldNo.Caption := '
-';
stFieldCount.Color := clBtnFace;
end;
procedure TMainForm.btnPickFileClick(Sender: TObject);
begin
if FileEdit.Text <> '
'
then
OpenDialog.InitialDir := ExtractFileDir(FileEdit.Text);
if OpenDialog.Execute
then begin
FileEdit.Text := OpenDialog.FileName;
btnOpenClick(Sender);
end;
end;
procedure TMainForm.btnOpenClick(Sender: TObject);
begin
ResetDisplay;
if FileEdit.Text = '
'
then
Exit;
if not FileExists(FileEdit.Text)
then begin
ShowMessage('
File not found: ' + FileEdit.Text);
Exit;
end;
lbxRecords.Items.LoadFromFile(FileEdit.Text);
stLineCount.Caption := IntToStr(lbxRecords.Items.Count);
if lbxRecords.Items.Count > 0
then begin
lbxRecords.ItemIndex := 0;
ParseOptionChange(Sender);
end;
end;
procedure TMainForm.lbxRecordsClick(Sender: TObject);
begin
ParseRecord;
end;
procedure TMainForm.UpdateFieldNo;
begin
if lbxFields.ItemIndex >= 0
then
stFieldNo.Caption := Format('
%d (%d)',
[lbxFields.ItemIndex + 1, Length(lbxFields.Items[lbxFields.ItemIndex])])
else
stFieldNo.Caption := '
-';
end;
procedure TMainForm.lbxFieldsClick(Sender: TObject);
begin
UpdateFieldNo;
end;
procedure TMainForm.ParseOptionChange(Sender: TObject);
begin
DelimEdit.Enabled :=
not rbCommaText.Checked;
QuoteEdit.Enabled :=
not rbCommaText.Checked;
NewlineEdit.Enabled := rbCustom.Checked;
cbEatWhitespace.Enabled := rbCustom.Checked;
if DelimEdit.Text = '
'
then
DelimEdit.Text := OptionToText(DefaultDelim);
FDelim := TextToOption(DelimEdit.Text)[1];
if QuoteEdit.Text = '
'
then
QuoteEdit.Text := OptionToText(DefaultQuote);
FQuote := TextToOption(QuoteEdit.Text)[1];
if NewlineEdit.Text = '
'
then
NewlineEdit.Text := OptionToText(DefaultNewline);
FNewline := TextToOption(NewlineEdit.Text);
{$ifdef DELPHI6_UP}
lbxFields.Items.Delimiter := FDelim[1];
lbxFields.Items.QuoteChar := FQuote[1];
{$endif}
{$ifdef BDS2006_UP}
cbStrictDelimiter.Enabled :=
not rbCustom.Checked;
lbxFields.Items.StrictDelimiter := cbStrictDelimiter.Checked;
{$endif}
ParseRecord;
end;
procedure TMainForm.ParseRecord;
var
i: Integer;
MultiLine, GoodData: Boolean;
begin
stLineNo.Color := clBtnFace;
stFieldCount.Color := clBtnFace;
lbxFields.Items.BeginUpdate;
try
lbxFields.Items.Clear;
i := lbxRecords.ItemIndex;
if i < 0
then begin
stFieldCount.Caption := '
-';
stFieldNo.Caption := '
-';
Exit;
end;
stLineNo.Caption := Format('
%d (%d)', [i + 1, Length(lbxRecords.Items[i])]);
if rbCustom.Checked
then begin
GoodData := True;
MultiLine := False;
repeat
if not ParseCSVLine(lbxRecords.Items[i], lbxFields.Items,
MultiLine, FQuote[1], FDelim[1], FNewline,
cbEatWhitespace.Checked)
then
GoodData := False;
Inc(i);
if MultiLine
then
stLineNo.Color := clYellow;
// Indicate a multi-line record with color
until (
not MultiLine)
or (i = lbxRecords.Items.Count);
if MultiLine
or not GoodData
then // If MultiLine is still true, we ran out of data!
stFieldCount.Color := clRed;
// Indicate bad data with color
end else if rbCommaText.Checked
then begin
lbxFields.Items.CommaText := lbxRecords.Items[i];
{$ifdef DELPHI6_UP}
end else if rbDelimitedText.Checked
then begin
lbxFields.Items.DelimitedText := lbxRecords.Items[i];
{$endif}
end;
if lbxFields.Items.Count > 0
then
lbxFields.ItemIndex := 0;
finally
lbxFields.Items.EndUpdate;
end;
stFieldCount.Caption := IntToStr(lbxFields.Items.Count);
UpdateFieldNo;
end;
end.