Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 711
  • Last Modified:

Search for text and delete from file

How do I search for a string of text in a file, using wild card, and then delete the entire line from the file....

if line contains "My name is *", delete line from file
0
MichelleLacy
Asked:
MichelleLacy
1 Solution
 
ddayx10Commented:
You might try looking at this post, it gives pretty sound idea of the limitations of what you are trying to do and a solution:

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/VB_Controls/Q_21696282.html
0
 
iHadiCommented:
Hi

try the following code (I'm assuming your not opening text files over 10s of megabytes):
string filePath = "your file path";
 
string fileContent = File.ReadAllText(filePath);
 
fileContent = Regex.Replace(fileContent, "My name is.*", "", RegexOptions.Multiline | RegexOptions.IgnoreCase);
 
File.WriteAllText("your file path", fileContent);

Open in new window

0
 
zweiSoftware DeveloperCommented:
iHadi, your code doesn't delete the whole line.

How about this modification:
string filePath = "file path";
string fileContent = File.ReadAllText(filePath);
String[] lines = fileContent.Split('\n');
fileContent = "";
 
foreach(String line in lines) 
{
    if (! Regex.Match(line, ".*My name is.*", RegexOptions.IgnoreCase).Success)
    {
        fileContent += line + '\n';
    }
}
 
File.WriteAllText(filePath, fileContent);

Open in new window

0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
tcullerCommented:
Unfortunately, there is no way to actually "delete" something from a file. You have a few choices; I'll give you an un-optimized version of one of them (which will work for any size file, theoretically). Using Regex is somewhat overkill in this situation, "split" won't work correctly in case you have different types of line deliniations (\n, \r, etc), and File.ReadAllLines() will read any file into memory FIRST, potentially using up way to much memory. The solution below should be able to 'dodge' any of these potential problems. However, I did not optimize it completely because the goal of it is clarity. Modify it as you wish.
void RemoveFromFile(System.IO.FileInfo mySource)
{
    System.String output = mySource.FullName;
    mySource.MoveTo(mySource.Name + "_TEMP" + mySource.Extension);
 
    String line = null;
    using (System.IO.StreamReader reader = new System.IO.StreamReader(mySource.OpenRead()))
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(System.IO.File.OpenWrite(output)))
    {
        while (!reader.EndOfStream)
        {
            line = reader.ReadLine();
 
            if (!line.Contains("My name is "))
            { writer.WriteLine(line); }
        }
        writer.Flush();
    }
 
    mySource.Delete();
}

Open in new window

0
 
zweiSoftware DeveloperCommented:
@tculler: Good solution, reading and writing at the same time. I think I saw an example of that in ddayx10's link. I would still recommend to use regexes though (to allow for future modifications). This code would probably need to have .ToLower() on every line and "My name is ".
0
 
tcullerCommented:
I never check links, and question askers usually don't either. If they're asking a question, they should have already researched using such obvious resources.

I didn't do a ToLower(), or use regex, because I felt that from the question asked the problem was specific enough to target in on one thing, do that one thing, and do it very well. RegEx is awesome, but does require a bit of overhead when using it (though it will save time, and probably boost efficiency, in more complex situations). As long as you know this won't change, this solution is fairly optimized and expandable. Of course, if there is more content you must avoid, RegEx may become a necessity (though you would just replace the call to .Contains to a Regex call). Let me know if you'd like to see the implementation of my solution using RegEx, and I'll whip one up.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

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