/CSV.cs |
@@ -4,10 +4,11 @@ |
// rights of fair usage, the disclaimer and warranty conditions. // |
/////////////////////////////////////////////////////////////////////////// |
|
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Linq.Expressions; |
using System.Text; |
using System.Threading.Tasks; |
|
namespace wasSharp |
{ |
@@ -17,31 +18,32 @@ |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
/// <summary> |
/// Converts a list of string to a comma-separated values string. |
/// Converts a list of strings to a comma-separated values string. |
/// </summary> |
/// <param name="l">a list of strings</param> |
/// <returns>a commma-separated list of values</returns> |
/// <remarks>compliant with RFC 4180</remarks> |
public static string FromEnumerable(IEnumerable<string> l) |
{ |
string[] csv = l.Select(o => o).ToArray(); |
char[] escapeCharacters = {'"', ' ', ',', '\r', '\n'}; |
Parallel.ForEach(csv.Select((v, i) => new {i, v}), o => |
{ |
string cell = o.v.Replace("\"", "\"\""); |
public static Func<IEnumerable<string>, string> FromEnumerable = |
((Expression<Func<IEnumerable<string>, string>>) (data => string.Join(",", |
data |
.Select(o => o.Replace("\"", "\"\"")) |
.Select(o => o.IndexOfAny(new[] {'"', ' ', ',', '\r', '\n'}).Equals(-1) ? o : "\"" + o + "\"")))) |
.Compile(); |
|
switch (cell.IndexOfAny(escapeCharacters)) |
{ |
case -1: |
csv[o.i] = cell; |
break; |
default: |
csv[o.i] = "\"" + cell + "\""; |
break; |
} |
}); |
return string.Join(",", csv); |
} |
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
/// <summary> |
/// Converts successive comma-separated values to key-value pairs. |
/// </summary> |
/// <returns>key-value pairs of successive comma-separate values</returns> |
public static Func<string, IEnumerable<KeyValuePair<string, string>>> ToKeyValue = |
((Expression<Func<string, IEnumerable<KeyValuePair<string, string>>>>) |
(csv => ToEnumerable(csv).AsParallel().Select((o, p) => new {o, p}) |
.GroupBy(q => q.p/2, q => q.o) |
.Select(o => o.ToArray()) |
.TakeWhile(o => o.Length%2 == 0) |
.Where(o => !string.IsNullOrEmpty(o[0]) || !string.IsNullOrEmpty(o[1])) |
.ToDictionary(o => o[0], p => p[1]).Select(o => o))).Compile(); |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |