Remove control and non-ASCII characters from large files
One source of performance degradation is frequent memory allocations.  In your case, the StringBuilder will allocate space for every line in your file, and may allocate additional space (along with a data copy) for longer lines.

You can eliminate all of that by reusing the StringBuilder object.  At the start of BuildClearString, call the clear method on it (sb.Clear(); or sb.Length = 0;).  Follow that up by a capacity check.

if (sb.Capacity &lt; line.Length)
    sb.Capacity = line.Length;


By changing the capacity you ensure that you have a buffer big enough to hold all the characters you will be adding, so you won't incur any memory allocations when processing a line.  By reusing it, you keep the existing allocated memory, thus avoiding any allocations for later lines unless the line is longer than any you've already encountered.  You can also set an initial capacity on the StringBuilder object.