字符串截取问题,请教高效方法

terry三 2017-04-07 10:04:17
串口取的数据如下:
=-0001.0@=+0000.3@=+0001.1@=+0000.1@=-0001.0@=+0000.3@=+0001.1@=+0000.1@=-0001.0@=+0000.2@

我只想要=与@之的正负数,用什么截取方法最高效,因为每秒几百条要写入数据
...全文
173 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2017-04-07
  • 打赏
  • 举报
回复
program Project1;

{$APPTYPE CONSOLE}

uses
  Classes,
  SysUtils;

procedure Scan(const src: string; const line: TStrings);
var
  i: Integer;
  temp: string;
begin
  line.Clear;
  temp := '';
  for i := 1 to Length(src) do
  begin
    if src[i] = '=' then
    begin
      temp := '';
    end
    else if src[i] = '@' then
    begin
      line.Add(temp);
    end
    else
    begin
      temp := temp + src[i];
    end;
  end;
end;

const
  Data = '=-0001.0@=+0000.3@=+0001.1@=+0000.1@=-0001.0@=+0000.3@=+0001.1@=+0000.1@=-0001.0@=+0000.2@';

var
  line: TStringList;
  i: Integer;

begin
  line := TStringList.Create;
  try
    Scan(Data, line);
    for i := 0 to line.Count - 1 do
    begin
      Writeln(line[i]);
    end;
  finally
    line.Free;
  end;
end.
terry三 2017-04-07
  • 打赏
  • 举报
回复
我用这种方式很慢,记录不完整 var com:string; strs :TStrings; i :Integer; begin Memo1.Clear; com:='=+0000.2@=-0000.3@=-0000.4@=+0000.5@'; strs := TStringList.Create; strs.Delimiter := '@'; //strs.QuoteChar := '='; strs.DelimitedText := com; for i :=0 to Strs.Count-1 do ShowMessage(Strs[i]);
pathletboy 2017-04-07
  • 打赏
  • 举报
回复
扫描啊,扫到=开始存,扫到@结束。
Mr Dang 2017-04-07
  • 打赏
  • 举报
回复
是不是可以改变下软件处理数据的方式,比如先缓存数据,再挨个处理。或者采用查询方式,读取一次数据,处理完再读取再处理。。。
Mr Dang 2017-04-07
  • 打赏
  • 举报
回复
正则表达式.
cxy_sc 2017-04-07
  • 打赏
  • 举报
回复
既然来自设备的数据格式的固定的,那就直接Copy特定位置的连续字串。。。
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k: integer;
  sData: string;
  sList: TStringList;
begin
  sList := TStringList.Create;
  for i := 1 to 1000 do
  begin
    j := random(99999);
    k := random(2);
    if k = 1 then
      sData := sData + '=' + formatfloat('+0000.0', j / 10) + '@'
    else
      sData := sData + '=' + formatfloat('-0000.0', j / 10) + '@';
  end;
  sList.Text := sData;
  sList.SaveToFile('sData.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: integer;
  sData: string;
  sList: TStringList;
begin
  sList := TStringList.Create;
  sList.LoadFromFile('sData.txt');
  sData := sList.Text;
  sList.Clear;
  for i := 0 to Length(sData) div 9 -1  do
    sList.Add(Copy(sData, i * 9 + 2, 7));
  ShowMessage(sList.Text);
end;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧