Hard on the heels on Paul's SortableStringValue I thought I would convert 'h.brouwer's Regex CSV splitter into an extension method. I've also added a couple of options to bring it in line with the standard String.Split() method.
public static class Extensions
{
public static string[] SplitCsv(this string line)
{
return SplitCsv(line, int.MaxValue, StringSplitOptions.None);
}
public static string[] SplitCsv(this string line, int count)
{
return SplitCsv(line, count, StringSplitOptions.None);
}
public static string[] SplitCsv(this string line, StringSplitOptions options)
{
return SplitCsv(line, int.MaxValue, options);
}
public static string[] SplitCsv(this string line, int count, StringSplitOptions options)
{
return (from Match m in Regex.Matches(line,
@"(((?<x>(?=[,\r\n] ))|""(?<x>([^""]|"""") )""|(?<x>[^,\r\n] )),?)",
RegexOptions.ExplicitCapture)
select m.Groups[1].Value).Where(i => (options == StringSplitOptions.None) || (options == StringSplitOptions.RemoveEmptyEntries && i != "")).Take(count).ToArray();
}
}
It has four overloaded methods:
- SplitCsv()
All substrings are returned
- SplitCsv(int count)
To limit the maximum number of substrings to return
- SplitCsv(StringSplitOptions options)
Use StringSplitOptions.RemoveEmptyEntries to omit empty array elements from the array returned, or StringSplitOptions.None to include empty array elements in the array returned.
- SplitCsv(int count, StringSplitOptions options)
Used like this:
string[] fields = line.SplitCsv();
string[] fields = line.SplitCsv(10);
string[] fields = line.SplitCsv(StringSplitOptions.RemoveEmptyEntries);
string[] fields = line.SplitCsv(10, StringSplitOptions.RemoveEmptyEntries);
No comments:
Post a Comment