में टेक्स्ट को विभाजित करने का तेज़ तरीका मेरे पास एक ऐप है जिसे TStringList में भारी टेक्स्ट मैनिपुलेशन करने की आवश्यकता है। असल में मुझे एक डिलीमीटर द्वारा पाठ को विभाजित करने की आवश्यकता है; उदाहरण के लिए, यदि मेरे पास 1000 वर्णों के साथ एक सिंगल लाइन है और इस लाइन में यह डिलीमीटर 3 बार होता है, तो मुझे इसे 3 लाइनों में विभाजित करने की आवश्यकता होती है। डिलीमीटर में एक से अधिक चार हो सकते हैं, उदाहरण के लिए यह '[test]' जैसा टैग हो सकता है।डेल्फी TStringList
मैंने इस कार्य को 2 अलग-अलग दृष्टिकोणों के साथ करने के लिए दो कार्य लिखे हैं, लेकिन दोनों बड़ी मात्रा में टेक्स्ट (आमतौर पर 2 एमबाइट्स) में धीमे होते हैं।
मैं इस लक्ष्य को तेज़ी से कैसे प्राप्त कर सकता हूं?
यहां दोनों कार्य हैं, दोनों को 2 पैरामीटर प्राप्त होते हैं: 'रेखाएं' जो मूल tstringlist और 'q' है जो delimiter है।
function splitlines(lines : tstringlist; q: string) : integer;
var
s, aux, ant : string;
i,j : integer;
flag : boolean;
m2 : tstringlist;
begin
try
m2 := tstringlist.create;
m2.BeginUpdate;
result := 0;
for i := 0 to lines.count-1 do
begin
s := lines[i];
for j := 1 to length(s) do
begin
flag := lowercase(copy(s,j,length(q))) = lowercase(q);
if flag then
begin
inc(result);
m2.add(aux);
aux := s[j];
end
else
aux := aux + s[j];
end;
m2.add(aux);
aux := '';
end;
m2.EndUpdate;
lines.text := m2.text;
finally
m2.free;
end;
end;
function splitLines2(lines : tstringlist; q: string) : integer;
var
aux, p : string;
i : integer;
flag : boolean;
begin
//maux1 and maux2 are already instanced in the parent class
try
maux2.text := lines.text;
p := '';
i := 0;
flag := false;
maux1.BeginUpdate;
maux2.BeginUpdate;
while (pos(lowercase(q),lowercase(maux2.text)) > 0) and (i < 5000) do
begin
flag := true;
aux := p+copy(maux2.text,1,pos(lowercase(q),lowercase(maux2.text))-1);
maux1.add(aux);
maux2.text := copy(maux2.text,pos(lowercase(q),lowercase(maux2.text)),length(maux2.text));
p := copy(maux2.text,1,1);
maux2.text := copy(maux2.text,2,length(maux2.text));
inc(i);
end;
finally
result := i;
maux1.EndUpdate;
maux2.EndUpdate;
if flag then
begin
maux1.add(p+maux2.text);
lines.text := maux1.text;
end;
end;
end;
समस्या मेरी सीमांकक एक से अधिक चार है, यह एक पूरे शब्द, उदाहरण के लिए हो सकता है। – delphirules
प्रश्न में सभी आवश्यकताओं को शामिल करें। बीटीडब्ल्यू, कन्स्ट्रक्टर कॉल के बाद कोशिश करें। –
आपको इस प्रश्न का उत्तर देने योग्य मेरा उत्तर मिल सकता है: http://stackoverflow.com/questions/15424293/how-to-split-string-by-a-multi-character-delimiter/15427587#15427587 –