Solved

Replacing text in txt files

Posted on 2002-06-15
11
120 Views
Last Modified: 2010-04-04
I have my data saved as C:\data.txt and this is the data

Peter
Level=02
Panel=02

John
Level=02
Panel=02

how can i change the Peter 's Level's '02' to '03' and save the changes ?

I want my button to 'look' for the 2 digits allocated to 'Level' that is tagged under 'Peter' in data.txt, change it to '03' and save the changes.
0
Comment
Question by:tyfing
  • 5
  • 3
  • 3
11 Comments
 
LVL 4

Expert Comment

by:nestorua
ID: 7081139
HI,
You can do it in different ways:
1. Using TIniFile.
2. Using TStringList, finding the string "Peter",
then the next string is "Level=02", change digit "2" on digit
"3" as you do it working with strings.
Or work with that string as you do with the string
"A=B".
Sincerely,
Nestorua.

0
 

Author Comment

by:tyfing
ID: 7081515
i do not get wat u mean
0
 
LVL 4

Expert Comment

by:nestorua
ID: 7081686
HI,
Put it more clearily (for the second proposition).
1.Read your file to TStringList object (call it YourStringList).
2.Using IndexOf method of YourStringList find the index of the string "Peter".
3.The next index in YourStringList has then the string "Level=02".
4.Change in that string the last Char from "2" to "3".
That's all.
Sincerely,
Nestorua.
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7081918
tyfing,

Copy/Paste (place Button1 on the form):
---------------


function ReplaceIt(FileName, HeaderString, ValueString, NewValue: String): Boolean;
var f: TStringList;
    start, i: Integer;
    s, OldVal: String;
begin
  Result:=FALSE;
  f:=TStringList.Create;
  try
      if not FileExists(FileName) then Exit;
      // Grab file into TStringList:
      f.LoadFromFile(FileName);
      // Find first occurence of line with HeaderString:
      start:=f.IndexOf(HeaderString);
      if start=-1 then Exit;
      // Next line should have ValueString:
      s:=f.Strings[start+1];
      ValueString:=ValueString+'=';
      i:=Pos(ValueString, s);
      if i>0 then begin
         // Get value string and next 2 chars:
         OldVal:=Copy(s, i+Length(ValueString), 2);
         // Replace this with NewValue:
         f.Strings[start+1]:=StringReplace(s, ValueString+OldVal, ValueString+NewValue,
                                           [rfIgnoreCase]);
         Result:=TRUE;
         f.SaveToFile(FileName);
      end;
  finally
     f.Free;
  end;  
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ReplaceIt('C:\data.txt', 'Peter', 'Level', '00') then
     ShowMessage('Replaced OK.')
  else
     ShowMessage('Error!');
end;


0
 
LVL 7

Expert Comment

by:Cynna
ID: 7081919
OOPS!

Sorry nestorua, didn't read your comment (great minds think the same :=) ...

typfing, if you are satisfied with the code, please
give nestorua half of the points.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 7

Expert Comment

by:Cynna
ID: 7081923
OOPS #2!

I'm a bit sleepy today...

typfing, replace:

  if ReplaceIt('C:\data.txt', 'Peter', 'Level', '00') then
   
with:

  if ReplaceIt('C:\data.txt', 'Peter', 'Level', '03') then
0
 

Author Comment

by:tyfing
ID: 7083394
heck, i'm totally CONFUSED....argh
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7083624
typfing,

> heck, i'm totally CONFUSED....

OK, I will be very detailed, but please don't take this as patronising...

1. Start new application
2. Place Button1 on a Form
3. Goto Unit1.pas source, copy and paste following function:

function ReplaceIt(FileName, HeaderString, ValueString, NewValue: String): Boolean;
var f: TStringList;
   start, i: Integer;
   s, OldVal: String;
begin
 Result:=FALSE;
 f:=TStringList.Create;
 try
     if not FileExists(FileName) then Exit;
     // Grab file into TStringList:
     f.LoadFromFile(FileName);
     // Find first occurence of line with HeaderString:
     start:=f.IndexOf(HeaderString);
     if start=-1 then Exit;
     // Next line should have ValueString:
     s:=f.Strings[start+1];
     ValueString:=ValueString+'=';
     i:=Pos(ValueString, s);
     if i>0 then begin
        // Get value string and next 2 chars:
        OldVal:=Copy(s, i+Length(ValueString), 2);
        // Replace this with NewValue:
        f.Strings[start+1]:=StringReplace(s, ValueString+OldVal, ValueString+NewValue,
                                          [rfIgnoreCase]);
        Result:=TRUE;
        f.SaveToFile(FileName);
     end;
 finally
    f.Free;
 end;  
end;


4. Double-click Button1, and Copy/Paste this inside its event handler:

procedure TForm1.Button1Click(Sender: TObject);
begin
 if ReplaceIt('C:\data.txt', 'Peter', 'Level', '03') then
    ShowMessage('Replaced OK.')
 else
    ShowMessage('Error!');
end;

-----------------------------

Function which does what you want is ReplaceIt(). Its arguments are:

1. FileName     - full path of the file you are parsing
                  (in your case 'C:\data.txt')
2. HeaderString - The line that marks the start of the
                  block you want to change (in your case
                  it's 'Peter', but can be changed
                  to 'John')
3. ValueString  - The following line must contain this
                  string, then '=', then 2 digits (in your
                  case it's 'Level'
4. NewValue     - Digits will be replaced with this string
                  (you wanted '03')

------------------------------

Is this any clearer?



0
 

Author Comment

by:tyfing
ID: 7083705
yes thanx.how abt i give all the points to u and u share it out ?
0
 
LVL 7

Accepted Solution

by:
Cynna earned 50 total points
ID: 7084232
OK, fine with me.
nestorua, all OK?
0
 
LVL 4

Expert Comment

by:nestorua
ID: 7090198
HI,
Do as you want.
Sincerely,
Nestorua.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

895 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

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now