Link to home
Start Free TrialLog in
Avatar of kusanagi
kusanagi

asked on

File editing without changing structure


 File editing without changing structure
       
 
 
 Hi,

   I am trying to open and edit a tab delimited file. I need to replace one column header with a token. I am able to open and edit the file, however, the file structure ends up changing.

For example, if I have a file "data.txt" with a column name "Email" on the first line and I want to replace this with a standard token "Your Email"

I can read the line and use a regular expression to replace the column name with the token. Now when I try to write the line back into the same file using the WriteLine method of a streamwriter it overwrites part of the second line of "data.txt"

Is there a way I can go into files and edit parts of it without chainging the file. I know it can be done in Java, but is it possible in C##

I dont want to create a new file, only edit the current file I have

Thanks

Umer

For reference this is what I am doing

 

try

{


sr = new StreamReader(filename);


//create a StreamReader to read file

String line;


line = sr.ReadLine();

//read first line of the file

if(sr!=null)

sr.Close();


sb = new FileStream(filename, FileMode.OpenOrCreate);

//create a new file stream with Open or Create access

sw = new StreamWriter(sb);

int k = token.Length;

 // If you just use the StreamWriter without wrapping it in FileStream you overwrite the file.

// It does not replace the first line. FileMode.OpenOrCreate lets you open the file and write to it.

if(token.Length<email.Length)

{

for(int i=0;i<email.Length - k ;i++)

{

token = token + " ";

}



string line1 = Regex.Replace(line, email, token, RegexOptions.Compiled|RegexOptions.Singleline|RegexOptions.IgnoreCase);

//replace occurence of email with desired token case insensitive

sw.WriteLine(line1);

//Write to the file

 

 

if(sw!=null)

sw.Close();

if(sb!=null)

sb.Close();



}




catch (Exception e)

{

System.Diagnostics.Debug.WriteLine(e.Message);

}

finally

{

if(sr!=null)

sr.Close();

if(sw!=null)

sw.Close();

if(sb!=null)

sb.Close();


}

 

 
 
 
Avatar of Mike Tomlinson
Mike Tomlinson
Flag of United States of America image

If you don't want to use a secondary file then you need to store the ENTIRE new file in memory and then overwrite the file with the changes all at once.

Read the source file line by line and store each changed line in a StringBuilder for instance.  Then close the file and reopen it in write mode.  Now write out the changed lines from StringBuilder all at once, overwriting what was already there.
Avatar of kusanagi
kusanagi

ASKER

I am trying to save the time it takes to overwrite the whole file. What you said is my current solution.
However, I will be looking at very large files and I will always have to make a change to only the first line.
 I don't want to resort to overwriting the whole file if I have an alternate.
I know there are utilities in Unix to do this but I want to do this in C##
ASKER CERTIFIED SOLUTION
Avatar of Mike Tomlinson
Mike Tomlinson
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial