2012-04-06 12 views
2

Ich muss eine Tonne Daten durchlaufen, die in einer Paradox-Tabelle in einem Memo-Feld gespeichert ist. Ich muss diese Daten Zeile für Zeile verarbeiten und jede Zeile verarbeiten.Text aus einem Memobox ziehen Zeile für Zeile

Wie kann ich Delphi sagen, jede Zeile im Memo-Feld einzeln zu holen?

Kann ich # 13 # 10 als Trennzeichen verwenden?

Antwort

5

dass Angenommen, was in der Memofelds ist verwendet # 13 # 10 als der Linientrenner dann würde ich eine TStringList verwenden, und die sehr nützlich Text Eigenschaft des Memofelds Text in einzelne Zeilen aufgeteilt:

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

Auch wenn in Ihrem Memofeld Unix-Zeilenumbrüche verwendet werden, interpretiert dieser Code das Memofeld korrekt.

+0

'TStringList' unterstützt Parsing Text, '# 13 # 10' verwenden,' # 13' und ' # 10' als Zeilenumbrüche. –

+0

@Remy Documentation states "Beim Festlegen von Text wird der Wert analysiert, indem bei jedem Wagenrücklauf oder Zeilenvorschub in Teilzeichenfolgen getrennt wird. (Die beiden müssen keine Paare bilden.)" Ist das veraltet? Ich habe die Dokumentation genau zu diesem Punkt überprüft, kurz vor meiner letzten Bearbeitungsfrist (d. H. Dem letzten Satz). –

+1

nein, es ist immer noch gültig. Wenn die 'LineBreak' -Eigenschaft auf' sLineBreak' (der systemeigene Zeilenumbruch) gesetzt ist, werden alle drei Zeilenumbruchtypen ('CR',' LF', 'CRLF') gesucht. Wenn die Eigenschaft 'LineBreak' auf etwas anderes gesetzt ist, wird nur nach diesem Wert gesucht. –

2

Es hängt davon ab, wie das Feld tatsächlich in Paradox deklariert wird. Wenn es ein TMemoField ist, ist es ziemlich einfach:

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; 

Wenn es ein TBlobField ist, ist es ein wenig komplizierter. Sie müssen das Memo-Feld mit einem TBlobStream, und laden Sie den Inhalt dieses Stroms in einen TStringList lesen:

// 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; 
+0

Sie sollten die 'TDataSet.CreateBlobStream()' Methode verwenden, anstatt die 'TBlobStream' Klasse direkt zu instanziieren. Dadurch kann die DB-Komponente entscheiden, welche Implementierung für den Stream am besten geeignet ist. –

+0

@Remy: Ich habe darüber nachgedacht, das Snippet hinzuzufügen; Ich werde meinen Code aktualisieren, um auch diese Alternative anzuzeigen. (Es existierte nicht in frühen Delphi-Versionen, und es gab keine Version in der Frage erwähnt; ich ging mit mindestens gemeinsamen Dämoninator und was ich zu der Zeit griffbereit hatte.) –

+0

'CreateBlobStream()' existiert seit mindestens D5 sicher, vielleicht früher. –

Verwandte Themen