Login Register






Thread Rating:
  • 0 Vote(s) - 0 Average


Snippet - Read StreamReader Contents In Chunks filter_list
Author
Message
Snippet - Read StreamReader Contents In Chunks #1
Here's a cool snippet I came up with to read using a StreamReader in chunks based on an input of how many lines you want to read at a time until the end of the Stream for the file.

Good example usage for where the null coalescing operator in C# comes in nicely as well :ok:

I used the fully fleged StringBuilder just in case we're dealing with a fair bit of lines based on the lnBufferCount for determining the buffer size for the string we're dealing with through the loop.

Code:
private void MainMethod()
{
    using (StreamReader sr = new StreamReader(@"F:\file.txt"))
    {
        string lnBuffer = string.Empty;
        int lnBufferCount = 5;

        //If based on user input:
        if (lnBufferCount < 1) throw new ArgumentException("lnBufferCount cannot be less than 1.");

        while (LinesAvailable(ref lnBuffer, ReadLines(lnBufferCount, sr)))
        {
            MessageBox.Show(lnBuffer);
        }
    }
}

private bool LinesAvailable(ref string lnBuffer, string readLine)
{
    lnBuffer = readLine;
    return !(lnBuffer.StartsWith("\0"));
}

private string ReadLines(int numLines, StreamReader reader)
{
    StringBuilder sb = new StringBuilder();

    Array.ForEach(Enumerable.Range(1, numLines).ToArray(), i => sb.AppendLine(reader.ReadLine() ?? "\0"));
    return sb.ToString();
}

Enjoy Smile
ArkPhaze
"Object oriented way to get rich? Inheritance"
Getting Started: C/C++ | Common Mistakes
[ Assembly / C++ / .NET / Haskell / J Programmer ]

Reply

RE: Snippet - Read StreamReader Contents In Chunks #2
So say we had a file like:
Code:
Name: ArkPhaze
UID: 1234
Group: Regular

Name: Frooxious
UID: 234134
Group: Regular

Name: 1llusion
UID: 64445
Group: Admin

Name: bluedog.tar.gz
UID: 77777
Group: Admin

Now I can read off the data from this file in chunks of linecounts of 4 in length, which enables me to deal with these string values each time through the loop, and apply my standard action to each:

Code:
Name: ArkPhaze
UID: 1234
Group: Regular

Code:
Name: Frooxious
UID: 234134
Group: Regular

Code:
Name: 1llusion
UID: 64445
Group: Admin

Code:
Name: bluedog.tar.gz
UID: 77777
Group: Admin


Example: (Using the file above)
Code:
private void MainMethod()
{
    using (StreamReader sr = new StreamReader(@"F:\file.txt"))
    {
        string lnBuffer = string.Empty;
        int lnBufferCount = 4;

        //If based on user input:
        if (lnBufferCount < 1) throw new ArgumentException("lnBufferCount cannot be less than 1.");

        while (LinesAvailable(ref lnBuffer, ReadLines(lnBufferCount, sr)))
        {
            string[] lines = lnBuffer.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);
            string[] data = lines.Take(3).Select(s => s.Split(':')[1].Trim()).ToArray();
            MessageBox.Show(string.Format("The member {0} has a UID of {1} and is in the {2}'s group.", data[0], data[1], data[2]));
        }
    }
}

private bool LinesAvailable(ref string lnBuffer, string readLine)
{
    lnBuffer = readLine;
    return !(lnBuffer.StartsWith("\0"));
}

private string ReadLines(int numLines, StreamReader reader)
{
    StringBuilder sb = new StringBuilder();

    Array.ForEach(Enumerable.Range(1, numLines).ToArray(), i => sb.AppendLine(reader.ReadLine() ?? "\0"));
    return sb.ToString();
}

Result:
[Image: EOQOI.png]

[Image: vQOej.png]

[Image: 5WHcz.png]

[Image: fAegn.png]

You could even have used Regex.

Not too good with Regex, but here's an example:
Code:
Match m = Regex.Match(lnBuffer, @"\bName: (.*?)\r\nUID: (.*?)\r\nGroup: (\w.*?)\r?\n?\b");
MessageBox.Show(string.Format("The member {0} has a UID of {1} and is in the {2}'s group.", m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value));

Inside the while loop.
ArkPhaze
"Object oriented way to get rich? Inheritance"
Getting Started: C/C++ | Common Mistakes
[ Assembly / C++ / .NET / Haskell / J Programmer ]

Reply







Users browsing this thread: 1 Guest(s)