• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 268
  • Last Modified:

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();


}

 

 
 
 
0
kusanagi
Asked:
kusanagi
  • 2
1 Solution
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
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.
0
 
kusanagiAuthor Commented:
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##
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Well...

You said you want to change "Email" to "Your Email".  This means that all the rest of the data beyond that point in the file would have to SHIFT to the right to make space for the extra characters "Your ".  You can't do this in place with file operations...that just isn't how files work.  =\

If you were changing the data to something else that had the same length (thus no shifting), then it would be possible to move the file pointer and simply overwrite the data that is already there.

If you are dealing with very large files then I don't think you should keep the entire file in memory either.

A secondary file makes the most sense here.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now