Domanda

I need to go through a ton of data that is stored in a paradox table within a Memo field. I need to process this data line by line and process each line.

How can I tell Delphi to fetch each line in the memo field one by one?

Could I use #13#10 as a delimiter?

È stato utile?

Soluzione

Assuming that what is in the memo field uses #13#10 as the line separator then I would use a TStringList, and the very useful Text property to split the memo field text into separate lines:

var
  StringList: TStringList;
  Line: string;
.....
StringList.Text := MemoFieldText;
for Line in StringList do
  Process(Line);

Even if your memo field uses Unix linefeeds then this code will interpret the memo field correctly.

Altri suggerimenti

It depends on how the field is actually declared in Paradox. If it's a TMemoField, it's pretty easy:

var
  SL: TStringList;
  Line: string;
begin
  SL := TStringList.Create;
  try
    SL.Text := YourMemoField.GetAsString;
    for Line in SL do
     // Process each line of text using `Line`
  finally
    SL.Free;
  end;
end;

If it's a TBlobField, it's a little more complicated. You need to read the memo field using a TBlobStream, and load the content of that stream into a TStringList:

// For Delphi versions that support it:
procedure LoadBlobToStringList(const DS: TDataSet; const FieldName: string;
  const SL: TStringList);
var
  Stream: TStream;
begin
  Assert(Assigned(SL), 'Create the stringlist for LoadBlobToStringList!');
  SL.Clear;
  Stream := DS.CreateBlobStream(DS.FieldByName(FieldName), bmRead);
  try
    SL.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

// For older Delphi versions that do not have TDataSet.CreateBlobStream
procedure LoadBlobToStringList(const DS: TDataSet; const TheField: TField; 
  const SL: TStringList);
var
  BlobStr: TBlobStream;
begin
  Assert(Assigned(SL), 'Create the stringlist for LoadBlobToStringList!');
  SL.Clear;
  BlobStr := TBlobStream.Create(DS.FieldByName(TheField), bmRead);
  try
    SL.LoadFromStream(BlobStr);
  finally
    BlobStr.Free;
  end;
end;

// Use it
var
  SL: TStringList;
  Line: string;
begin
  SL := TStringList.Create;
  LoadBlobToStringList(YourTable, YourMemoFieldName, SL);
  for Line in SL do
    // Process each Line, which will be the individual line in the blob field

  // Alternatively, for earlier Delphi versions that don't support for..in
  // declare an integer variable `i`
  for i := 0 to SL.Count - 1 do
  begin
    Line := SL[i];
    // process line of text using Line
  end;
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top