如何写一个 更新字符串记录的函数?(100分)

  • 主题发起人 主题发起人 delhpi
  • 开始时间 开始时间
D

delhpi

Unregistered / Unconfirmed
GUEST, unregistred user!
对于字符串
AAA,BBB,CCC,DDD,EEE

经常遇到的情况是,需要取指定位置的字符子串,相当于一个字段值。

如果想更新,如何写函数呢?
比如要更新第3个字段为PPP
AAA,BBB,PPP,DDD,EEE

AAA BBB PPP等 只是字段内容的举例假设。
 
天书,谁能看懂啊?都说不会话了,呵呵
 
字符串 AAA,BBB,CCC,DDD,EEE
需要取指定位置的字符子串,相当于一个字段值
比如要更新第3个字段为PPP
AAA,BBB,PPP,DDD,EEE


请问,你这究竟是一个字符串,还是N个字段?
迷糊了
 
把字符串放到TStringList 注明分隔符
直接对 Stringlist[2] := PPP;
 
楼主先回小学一年级学好语文再来提问吧,看不明白阿?是字符串操作还是表的字段操作阿?
 
是 字符串。我说了“需要取指定位置的字符子串,相当于一个字段值”

现在的问题 是 “更新”。
类似表的情况。
一行内容就是相当于一条记录。
一行的内容,用逗号分隔内容,相当于不同的字段。
 
stringReplace(str,'bbb','ppp',[rfIgnoreCase]);
 
1.是字符串 需要取指定位置的字符子串,相当于一个字段值
2.一行内容就是相当于一条记录
3.一行的内容,用逗号分隔内容,相当于不同的字段
1 and 2 and 3
不懂是什么?
 
来自:hzjzxp, 时间:2008-5-16 8:42:49, ID:3893781
把字符串放到TStringList 注明分隔符
直接对 Stringlist[2] := PPP;
===========
用这个方法我也想到了,自己的水平也只会用这个办法了。这种情况下,这个TStringList 变量是否要设置为 全局 的?如果设置为 某个函数的本地变量的话,每次使用这个函数都要先 Create,用完后 再Free。如果这个函数调用很频繁,不知道这样是否科学?


来自:李翔鹏, 时间:2008-5-16 9:59:24, ID:3893831
stringReplace(str,'bbb','ppp',[rfIgnoreCase]);
===========
当然不能这样,这样是忽悠、搞笑。我是要更新 指定子串的值。


来自:DIGUA, 时间:2008-5-16 9:59:58, ID:3893834
1.是字符串 需要取指定位置的字符子串,相当于一个字段值
2.一行内容就是相当于一条记录
3.一行的内容,用逗号分隔内容,相当于不同的字段
1 and 2 and 3
不懂是什么?
===================
简单的说,数据是个文本文件,结构和大家熟悉的表类似。
一行字符串,类似于表的一条记录;
每行字符串,都用逗号分隔内容,类似于记录的字段。

现在是要“更新”一行字符串中的某个子串。
 
多大多频繁?
很大很频繁 的话,还是转到 数据库里面的表 去处理吧。
很小很频繁 的话,还是你自己的做法吧,用stringlist来做吧,记得释放就是。

个人看法。
 
你用readln每行读,
读出来就判断有多少个',',用posex()
然后替换就是了,看看这个函数说明system.move()
 
谢谢楼上 学习一下Move函数,看看是否合适。
 
觉得move不是很可行啊,因为 lz的意思是,替换字符长度可能不一样的,move毕竟好像是1对1。
 
看来只能采用笨办法了。
 
目前想到2种笨办法,一种是 stringlist类的方法。

另外一种 是“读”的方法。虽然 现在的目标是 “写”,是“更新”一个字符串中的 子串。把其他子串读出来,(读指定的子串有办法,自己搜藏了一个效率很高的函数,没有用COPY POS等),和更新内容子串再组合成新的字符串。
 
第二种方法是一个好方法,不错。
不过好像pos ansipos之类效率也很高啊,为什么不用?
“其它子串”?用这种方法,好像只有3个串:前面的、命中的、后面的,为什么还要读 其他“子”串?
 
楼上的意思我明白,整个字符串分成3块。关键是这个拆分,至少我自己实现起来有点难度,用户POS之类的函数,用少量的代码。

比如有这样的 一行字符串
SS,ADD,SS,EWEW,EE,SS

实际我要更新第3个子串的内容(假设SS为PP),不过整个字符串里有3个值一样的子串,所以用POS之类的函数,我感觉很难一下子,用比较简单的代码,把整个字符串很快的分成“前面的、命中的、后面的”3块。当然这个主要还是自己水平问题。

但是我的思路和楼上的一样,最后组合新的字符串时,也是3段组合。不过,前面的、后面的,这2块,我分别通过一个循环来读取每个子串(当然不包括需要更新的那个)、然后组合,还做不到直接一下子就能拆分出来。不过读取子串的函数效率很高,没有用到COPY ,POS ,用的是指针,应该效率也不错。

用TStringList的方法其实更简单,只不过这个TStringList可能最好需要声明成全局的,这样不用每次都Create, Free。现在我2个地方需要这个功能,分别做了1个函数,2种方法都采用。
 
我建议,如果你这个字符文本比较大的话,用stringstream
创建这个字符文本的时候对每行建个索引,纪录下改行的起始位置
var
fs:tfilestream;
ms:tmemorystream;
ss,sd,offset:integer;
s:string;
begin
ms.LoadFromFile('test.txt');
fs.Create('test.txt',fmOpenWrite);
fs.Size:=0;
ms.Position:=0;
fs.CopyFrom(ms,ss); {写入替换字符串前面的部分}
fs.Write(s,length(s)); {写入要替换的字符串}
ms.Position:=sd;
fs.CopyFrom(ms,ms.Size-sd); {写入替换后的部分}
offset:=length(s)-(sd-ss); {长度的更改,为了修正替换后的索引值}

...
{如果要是经常要替换这个文件内容,可以考虑使用2个全局memorystream,
每次程序启动先读入数据,每次修改都只在内存中进行,不保存
每次替换完后,纪录成新的数据:
ms.Size:=0;
fs.Position:=0;
ms.CopyFrom(fs,fs.Size;)
ms.Position:=0;
fs.Position:=0;
}
end;
 
多人接受答案了。
 
对不起楼主了,一直没关心这个帖子,发现结贴了,才知道你有留过一些话。

你说的要求是找出第n个字符串,这个好像不难啊,不管字符是否相同,你直接从头数","不就可以了?数到了,位置也出来了,再接着数,后面的起始位置也出来了,直接copy + str2 + copy不就行了?
 

Similar threads

后退
顶部