wasSharp – Blame information for rev 52

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 zed 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 //
3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
4 // rights of fair usage, the disclaimer and warranty conditions. //
5 ///////////////////////////////////////////////////////////////////////////
6  
7 using System.Collections.Generic;
8 using System.Linq;
9 using System.Text;
10  
11 namespace wasSharp
12 {
7 office 13 public static class CSV
1 zed 14 {
15 ///////////////////////////////////////////////////////////////////////////
16 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
17 ///////////////////////////////////////////////////////////////////////////
18 /// <summary>
6 eva 19 /// Converts a list of strings to a comma-separated values string.
1 zed 20 /// </summary>
21 /// <returns>a commma-separated list of values</returns>
22 /// <remarks>compliant with RFC 4180</remarks>
7 office 23 public static string FromEnumerable(IEnumerable<string> input)
24 {
25 return string.Join(",",
26 input
6 eva 27 .Select(o => o.Replace("\"", "\"\""))
27 office 28 .Select(o => o.IndexOfAny(new[] { '"', ' ', ',', '\r', '\n' }).Equals(-1) ? o : "\"" + o + "\""));
7 office 29 }
1 zed 30  
6 eva 31 ///////////////////////////////////////////////////////////////////////////
7 office 32 // Copyright (C) 2016 Wizardry and Steamworks - License: GNU GPLv3 //
33 ///////////////////////////////////////////////////////////////////////////
34 /// <summary>
35 /// Converts a dictionary of strings to a comma-separated values string.
36 /// </summary>
37 /// <returns>a commma-separated list of values</returns>
38 /// <remarks>compliant with RFC 4180</remarks>
39 public static string FromDictionary<K, V>(Dictionary<K, V> input)
40 {
41 return string.Join(",", input.Keys.Select(o => o.ToString()).Zip(input.Values.Select(o => o.ToString()),
42 (o, p) =>
43 string.Join(",",
27 office 44 o.Replace("\"", "\"\"").IndexOfAny(new[] { '"', ' ', ',', '\r', '\n' }).Equals(-1)
7 office 45 ? o
46 : "\"" + o + "\"",
27 office 47 p.Replace("\"", "\"\"").IndexOfAny(new[] { '"', ' ', ',', '\r', '\n' }).Equals(-1)
7 office 48 ? p
49 : "\"" + p + "\"")));
50 }
51  
52 ///////////////////////////////////////////////////////////////////////////
6 eva 53 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
54 ///////////////////////////////////////////////////////////////////////////
55 /// <summary>
56 /// Converts successive comma-separated values to key-value pairs.
57 /// </summary>
58 /// <returns>key-value pairs of successive comma-separate values</returns>
7 office 59 public static IEnumerable<KeyValuePair<string, string>> ToKeyValue(string input)
60 {
27 office 61 return ToEnumerable(input).AsParallel().Select((o, p) => new { o, p })
62 .GroupBy(q => q.p / 2, q => q.o)
7 office 63 .Select(o => o.ToArray())
27 office 64 .TakeWhile(o => o.Length % 2 == 0)
36 office 65 .Where(o => !string.IsNullOrEmpty(o[0]))
33 office 66 .Select(o => new KeyValuePair<string, string>(o[0], o[1]));
7 office 67 }
1 zed 68  
69 ///////////////////////////////////////////////////////////////////////////
70 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
71 ///////////////////////////////////////////////////////////////////////////
72 /// <summary>
7 office 73 /// Converts a generic key value pair to a CSV.
74 /// </summary>
75 /// <returns>a commma-separated list of values</returns>
76 /// <remarks>compliant with RFC 4180</remarks>
77 public static string FromKeyValue<K, V>(KeyValuePair<K, V> input)
78 {
79 var key = input.Key.ToString();
80 var value = input.Value.ToString();
81  
82 return string.Join(",", key
27 office 83 .Replace("\"", "\"\"").IndexOfAny(new[] { '"', ' ', ',', '\r', '\n' }).Equals(-1)
7 office 84 ? key
85 : "\"" + key + "\"", value
86 .Replace("\"", "\"\"")
27 office 87 .IndexOfAny(new[] { '"', ' ', ',', '\r', '\n' })
7 office 88 .Equals(-1)
89 ? value
90 : "\"" + value + "\"");
91 }
92  
93 ///////////////////////////////////////////////////////////////////////////
94 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
95 ///////////////////////////////////////////////////////////////////////////
96 /// <summary>
1 zed 97 /// Converts a comma-separated list of values to a list of strings.
98 /// </summary>
99 /// <param name="csv">a comma-separated list of values</param>
100 /// <returns>a list of strings</returns>
101 /// <remarks>compliant with RFC 4180</remarks>
5 eva 102 public static IEnumerable<string> ToEnumerable(string csv)
1 zed 103 {
7 office 104 var s = new Stack<char>();
105 var m = new StringBuilder();
106 for (var i = 0; i < csv.Length; ++i)
1 zed 107 {
108 switch (csv[i])
109 {
110 case ',':
111 if (!s.Any() || !s.Peek().Equals('"'))
112 {
113 yield return m.ToString();
114 m = new StringBuilder();
115 continue;
116 }
117 m.Append(csv[i]);
118 continue;
119 case '"':
120 if (i + 1 < csv.Length && csv[i].Equals(csv[i + 1]))
121 {
122 m.Append(csv[i]);
123 ++i;
124 continue;
125 }
126 if (!s.Any() || !s.Peek().Equals(csv[i]))
127 {
128 s.Push(csv[i]);
129 continue;
130 }
131 s.Pop();
132 continue;
133 }
134 m.Append(csv[i]);
135 }
136  
137 yield return m.ToString();
138 }
139 }
27 office 140 }