Delphi Split строка, содержащая несколько записей с различными разделителями - PullRequest
0 голосов
/ 17 марта 2012

Я хочу разбить строку, содержащую несколько записей, на отдельные элементы в списке строк.(Delphi 7.)

Вот необработанный текст в виде одной длинной строки:

+ CMGL: 0, "REC UNREAD", "+ 27832729407" ,, "12 /03 / 17,21: 32: 05 + 08 "Это текст в сообщении 1 + CMGL: 1," REC UNREAD "," + 27832729407 ",," 12/03 / 17,21: 32: 30 + 08 "И это текст в сообщении 2 + CMGL: 2, "REC UNREAD", "+ 27832729407" ,, "12/03 / 17,21: 32: 58 + 08" Это текст в сообщении 3 + CMGL: 3, "REC UNREAD", "+ 27832729407" ,, "12/03 / 17,21: 33: 19 + 08" И, наконец, текст в сообщении 4 + CMGL: 4, "REC UNREAD", "+ 27832729407" ,, "12/03 / 17,21: 34: 03 + 08 "Хорошо, еще один текст в 5-м сообщении ОК

Я получил его от устройства GSM.Последний символ 2 символа всегда в порядке, и это результат моего устройства GSM.

Мне требуется следующий результат:

+CMGL: 0,"REC UNREAD","+27832729407",,"12/03/17,21:32:05+08"This is the text in message 1
+CMGL: 1,"REC UNREAD","+27832729407",,"12/03/17,21:32:30+08"And this is the text in message 2
+CMGL: 2,"REC UNREAD","+27832729407",,"12/03/17,21:32:58+08"This is the text in message 3
+CMGL: 3,"REC UNREAD","+27832729407",,"12/03/17,21:33:19+08"And finally text in message 4
+CMGL: 4,"REC UNREAD","+27832729407",,"12/03/17,21:34:03+08"Ok one more the the text in 5th message

(каждый + CGML является началом новой строки)

Я могу работать с ним отсюда, так как он единообразен.Буду признателен за любую помощь.Я надеюсь это имеет смысл.

Спасибо!

1 Ответ

4 голосов
/ 18 марта 2012

Вы можете использовать функции PosEx и Copy, чтобы создать функцию для разделения строки.

Проверьте этот образец

{$APPTYPE CONSOLE}

uses
  Classes,
  StrUtils,
  SysUtils;


const
  GSMMessage=
  '+CMGL: 0,"REC UNREAD","+27832729407",,"12/03/17,21:32:05+08"This is the text in message 1+CMGL: 1,"REC UNREAD","+27832729407",,"12/03/17,21:32:30+08"And this is the text in message 2+CMGL: 2,"REC UNREAD","+27832729407",,"12/03/17,21:32:58+08"'+
  'This is the text in message 3+CMGL: 3,"REC UNREAD","+27832729407",,"12/03/17,21:33:19+08"And finally text in message 4+CMGL: 4,"REC UNREAD","+27832729407",,"12/03/17,21:34:03+08"Ok one more the the text in 5th messageOK';


procedure SplitGSMMessage(const Msg : String; List : TStrings);
const
 StartStr='+CMGL';
Var
 FoundOffset : Integer;
 StartOffset : Integer;
 s           : String;
begin
  List.Clear;

    StartOffset := 1;
    repeat
      FoundOffset := PosEx(StartStr, Msg, StartOffset);
      if FoundOffset <> 0 then
      begin
       s := Copy(Msg, StartOffset, FoundOffset - StartOffset);
       if s<>'' then List.Add(s);
       StartOffset := FoundOffset + 1;
      end;
    until FoundOffset=0;

    // copy the remaining part
    s := Copy(Msg, StartOffset, Length(Msg) - StartOffset + 1);
    if s<>'' then List.Add(s);
end;

var
  List : TStrings;
begin
  try
    List:=TStringList.Create;
    try
     SplitGSMMessage(GSMMessage, List);
     Writeln(List.Text);
    finally
     List.Free;
    end;

  except
    on E: Exception do Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
...