delphi截取字符串问题请教大家

例如有下列类型的字符串(|是分隔符)
A B C D
|E3 73|F31 -11|
|E34 192|A3 -13|
现在我想分别将A对应的列(E3,E34)存入Excel第一列中,将B(73,192)存入第二列中,C(F31,A3)存于第三列中,D(-11,-13)存入第四列中,求教大家该如何实现呢?主要是截取对应的字符串不会写。万分感激您!

直接切割就行了,给你举个例子

比如说

var 
ss: Tstringlist;
str:string;
//
str:='1,2,3,4';
ss := tstringlist.Create;
ExtractStrings([','], [' '], pchar(str), ss);
//此时的ss中就保存有str按,分割之后的内容,即 ss.Count为4,ss.Strings[0]为'1',ss.Strings[3]为4

对于你上面的问题是一样的,因为不太清楚你具体的格式,你可以先清除换行符之类的,然后按|切割

追问

我这个字符串难就难在格式不一致,有的在间隔符“|”的前面有的在后面,要是想您上面举例的那样,我就不会提问了哦。

追答

没明白有什么不一样的,假定清掉回车什么的,然后把||替换为|,前后的|再去掉,结果就是
E3 73|F31 -11|E34 192|A3 -13
然后按|切割了,

你要的结果无非就是从0循环直到超出数组长度,步长为2(假定循环变量i),对于每一组数据 i 比如E3 F3 ,再按空格切割,得到E3和F73,同样再由i+1再得到F31和-11,分别就是你要的ABCD了,很简单的东西。
当然再简单点的方法就是用正则表达式来匹配了。

追问

朋友能否加个好友,还请您明示,该问题对我来说实在是太难了

追答procedure TForm1.Button1Click(Sender: TObject);
var
  source:string;
  a,b,c,d:string;
  part,sub: Tstringlist;
  i:integer;
begin
   source:='|E3          73|F31      -11|\r\n|E34       192|A3      -13|';
   source:=stringreplace(source, '\r', '', [rfReplaceAll]);
   source:=stringreplace(source, '\n', '', [rfReplaceAll]);
   source:=stringreplace(source, '||', '|', [rfReplaceAll]);
   source:=copy(source, 2, length(source) - 1);
   source:=copy(source, 1, length(source) - 1);
   part:=tstringlist.Create;
   sub:=tstringlist.Create;
   ExtractStrings(['|'], [' ','|'], pchar(source), part);
   i:=0;
   while i<part.Count do
   begin
     //showmessage(part.Strings[i]);
     ExtractStrings([' '], [' '], pchar(part.Strings[i]), sub);
     a:=sub.Strings[0];
     b:=sub.Strings[1];
     sub.Clear;
     ExtractStrings([' '], [' '], pchar(part.Strings[i+1]), sub);
     c:=sub.Strings[0];
     d:=sub.Strings[1];
     sub.Clear;
     showmessage('a='+a+' b='+b+' c='+c+' d='+d);
     i:=i+2;
   end;
end;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-14
由于delphi中没有split这种方便的函数,只能自己完成split功能,
一、直接使用如下函数(注:ch只能是单字符,如键盘上英文状态下的字符)

function SplitString(const Source,ch:String):TStringList;
var
temp:String;
i:Integer;
begin
Result:=TStringList.Create;
//如果是空自符串则返回空列表
if Source=''
then exit;
temp:=Source;
i:=pos(ch,Source);
while i<>0 do
begin
Result.add(copy(temp,0,i-1));
Delete(temp,1,i);
i:=pos(ch,temp);
end;
Result.add(temp);
end;
直接使用上面函数,将字符串传入source中,将分隔符‘丨‘传入ch中,返回值即是被分割的字符串数字,追问

这位朋友你的方法很好,只是不能解决我这里的问题,对于上面的朋友追问的一样,我的这个字符串格式有点小复杂,间隔字符“|”位置不同

相似回答