Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

how can i split this string?

Posted on 2009-05-14
6
Medium Priority
?
1,115 Views
Last Modified: 2012-05-06
im new to delphi...
 i have a string like this  " 123|asd1|fhgj2|er3|45678| " 
and i need to split it up.
i figured out how to do it IF it has different separators (eg " %123|asdf*fhgj^er|) like this
textin := %123|asdf|fhgj|er|45678|
 text1 := copy(textin, 1, pos('%', textin)-1);
  Delete(textin, 1, pos('%', textin)-1);
 text2 := copy(textin,1 ,pos('|', textin)-1);
  Delete(textin, 1, pos('|', textin)-1);
...
  L := Form2.ListView1.Items.Add;
  L.Caption := info;
  L.SubItems.Add(text1);
  L.SubItems.Add(text2);
ect

but how do i do it if the separators are the same?


0
Comment
Question by:electrodude102
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 2

Accepted Solution

by:
Usurpatirus earned 150 total points
ID: 24382522
you may use StringReplace function, or while loop:
procedure TForm1.Button2Click(Sender: TObject);
var
Str : String;
begin
Str := '%123|asdf*f|hgj^|er|';
 
   with Listview1.Items.Add do
   begin
        Caption := Copy(Str,1, Pos('|',Str)-1);
        system.Delete(Str,1,Pos('|',Str));
   while Trim(Str)<>'' do
   begin
        Subitems.Add(Copy(Str,1, Pos('|',Str)-1));
        System.Delete(Str,1,Pos('|',Str));
   end;
   end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
Str : String;
begin
Str := '%123|asdf*f|hgj^|er|';
with Listview1.Items.Add do
begin
        Caption := Copy(Str,1, Pos('|',Str)-1);
        System.Delete(Str,1,Pos('|',Str));
        SubItems.Text := (StringReplace(Str,'|',#13,[rfReplaceAll, rfIgnoreCase]));
end;
end;

Open in new window

0
 
LVL 9

Expert Comment

by:Graceful_Penguin
ID: 24382549
You just have to loop the code you have there and it will work. I used ShowMessage to test if it works but I have also given you the code to add it to the listview in comments.
textin := '123|asdf|fhgj|er|45678';
while (pos('|', textin) > 0) do
begin
  text1 := copy(textin, 0, pos('|', textin)-1);
  Delete(textin, 1, pos('|', textin));
 
 
//  L := Form2.ListView1.Items.Add;
//  L.Caption := info;
//  L.SubItems.Add(text1);
ShowMessage(text1);
ShowMessage(textin);

Open in new window

0
 
LVL 9

Expert Comment

by:Graceful_Penguin
ID: 24382556
sorry did not copy the end;
textin := '123|asdf|fhgj|er|45678';
while (pos('|', textin) > 0) do
begin
  text1 := copy(textin, 0, pos('|', textin)-1);
  Delete(textin, 1, pos('|', textin));
 
 
//  L := Form2.ListView1.Items.Add;
//  L.Caption := info;
//  L.SubItems.Add(text1);
  ShowMessage(text1);
  ShowMessage(textin);
end;

Open in new window

0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 1

Author Comment

by:electrodude102
ID: 24382733
Graceful_Penguin: that works but i need a var(?) for each "set" of the string (not sure how to explain it..)
 
example: if the string in was '123|asdf|fhgjer|45678' it does this
text0 := 123
text1 := asdf
text2 := fhgjer
text3 := 45678

(cause i need to use them later, get it?)
0
 
LVL 9

Expert Comment

by:Graceful_Penguin
ID: 24382874
The easiest way is to use a stringlist to store the strings but if you don't like that you can use a dynamic array. Here is the source for the string list. Just remember to destroy it when you are done.
var textin, text1 : string;
 Strings : TStringlist;
 counter : integer;
begin
   textin := '123|asdf|fhgj|er|45678';
   Strings := TStringlist.Create;
   counter := 0;
while (pos('|', textin) > 0) do
begin
  Strings.Add(copy(textin, 0, pos('|', textin)-1));
  Delete(textin, 1, pos('|', textin));
 
 
//  L := Form2.ListView1.Items.Add;
//  L.Caption := info;
//  L.SubItems.Add(text1);
   ShowMessage(Strings[counter]);
   ShowMessage(textin);
   inc(counter);

Open in new window

0
 
LVL 1

Author Comment

by:electrodude102
ID: 24387267
im going to accept Usurpatirus answer cause after messing around with it it seems he most usable, thanks you all your help
0

Featured Post

Tech or Treat!

Submit an article about your scariest tech experience—and the solution—and you’ll be automatically entered to win one of 4 fantastic tech gadgets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Geo-targeting is the practice of distributing content based on a person’s location, as best as you can determine it. Let’s look at some ways you could successfully use this tactic. The following tips and case studies could lead to meaningful results.
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
Suggested Courses

609 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question