PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tab2sql/Classes/Convertors/list2csv.cs

http://tab2sql.googlecode.com/
C# | 341 lines | 249 code | 46 blank | 46 comment | 55 complexity | 97b5614db5b65b8b8600072c57f5f6a6 MD5 | raw file
  1. using System;
  2. using System.Text;
  3. using System.Collections;
  4. namespace Tab2Sql
  5. {
  6. /// <summary>
  7. /// basic class to convert a list of values (separated by line breaks) and convert them into a sql friendly string - or similar.
  8. ///
  9. /// </summary>
  10. public class List2Csv
  11. {
  12. /// <summary>
  13. /// Produces an output of the form "AND something in ('1','2','3','4','5'). INPUT MUST BE LINE BREAK SEPARATED.
  14. /// Will show summary statistics if desired. (Although they are suppressed if the string is 400k characters or more in length)
  15. /// </summary>
  16. /// <param name="input">Line delimited list</param>
  17. /// <param name="showStats">Do you want some "interesting" statistics on your input?</param>
  18. /// <param name="sortOption">How should output be sorted?</param>
  19. /// <returns></returns>
  20. public static string List2InStatement(string input, bool showStats, List2CSVSortBy sortOption)
  21. {
  22. if (input.Trim().Length > 400000) { showStats = false; }
  23. int totalNumberOfElements = 0;
  24. int uniqueNumberoOfElements = 0;
  25. int longestLine = 0;
  26. string longestLineIs = "";
  27. bool skipFirstLine = false;
  28. //HACK : hard coded value
  29. int DesiredWidth = 3; //in columns, not characters
  30. var csvString = new StringBuilder();
  31. string columnName = "something";
  32. string[] tmpString = input.Split('\n');
  33. totalNumberOfElements = tmpString.Length;
  34. if (char.IsLetter(tmpString[0].ToCharArray()[0]))
  35. {
  36. columnName = tmpString[0].Trim();
  37. skipFirstLine = true;
  38. totalNumberOfElements--;
  39. }
  40. csvString.AppendLine("WHERE 1=1 ");
  41. csvString.AppendLine(" AND ["+columnName+"] IN \n\t(");
  42. ArrayList myList = new ArrayList();
  43. bool allNumerics=true;
  44. var termLengths = new int[tmpString.Length];
  45. int i = 0; // elements
  46. int k = 0; // unique elements
  47. foreach (string lines in tmpString)
  48. {
  49. if (skipFirstLine == true && i == 0)
  50. {
  51. //do nothing
  52. }
  53. else
  54. {
  55. if (!myList.Contains(lines))
  56. {
  57. k++;
  58. if(allNumerics==true)
  59. {
  60. if (DGen.DTypes.IsNumeric(lines) != true || (lines[0] == '0' && lines[1] == '0'))
  61. {
  62. allNumerics = false;
  63. }
  64. }
  65. myList.Add(lines);
  66. }
  67. }
  68. i++;
  69. }
  70. myList.Sort(new WhichIsLonger(sortOption));
  71. uniqueNumberoOfElements = k;
  72. string[] tmpString2 = (string[])myList.ToArray(typeof(string));
  73. tmpString = tmpString2;
  74. i = 0;
  75. foreach (string linus in tmpString)
  76. {
  77. if (linus.Trim().Length > longestLine)
  78. {
  79. longestLine = linus.Trim().Length;
  80. longestLineIs = linus.Trim();
  81. }
  82. i++;
  83. }
  84. i = 0;
  85. longestLine += 2;
  86. foreach (string line in tmpString)
  87. {
  88. if (i % DesiredWidth == 0 && i>0)
  89. {
  90. csvString.AppendLine();
  91. }
  92. string theTerm = line.Trim();
  93. if (theTerm.Length > 0)
  94. {
  95. if (allNumerics == false)
  96. {
  97. theTerm = string.Format("'{0}'", theTerm);
  98. }
  99. csvString.Append("\t\t");
  100. csvString.Append(theTerm.PadRight(longestLine, ' '));
  101. csvString.Append(",");
  102. }
  103. i++;
  104. }
  105. csvString.Remove(csvString.Length - 1, 1);
  106. csvString.AppendLine("\n\t)\n");
  107. var e = string.Format("-- Elements : {0} / Unique : {1} / Longest Element : {2} / Which is : {3} ",new object[]{ totalNumberOfElements, uniqueNumberoOfElements, longestLine, longestLineIs });
  108. csvString.AppendLine(e.ToString());
  109. if (showStats == true)
  110. {
  111. WordStats ws = new WordStats(input,@"[^_\[\]'\b]");
  112. csvString.AppendLine(@"/*"+Environment.NewLine+ws.EndString+Environment.NewLine+@"*/");
  113. ws=null;
  114. }
  115. return csvString.ToString();
  116. }
  117. /// <summary>
  118. ///
  119. /// </summary>
  120. public class WhichIsLonger : IComparer
  121. {
  122. List2CSVSortBy sortOption;
  123. /// <summary>
  124. ///
  125. /// </summary>
  126. /// <param name="sortChoice">
  127. /// A <see cref="List2CSVSortBy"/>
  128. /// </param>
  129. public WhichIsLonger (List2CSVSortBy sortChoice)
  130. {
  131. sortOption = sortChoice;
  132. }
  133. /// <summary>
  134. ///
  135. /// </summary>
  136. /// <param name="x">
  137. /// A <see cref="System.Object"/>
  138. /// </param>
  139. /// <param name="y">
  140. /// A <see cref="System.Object"/>
  141. /// </param>
  142. /// <returns>
  143. /// A <see cref="System.Int32"/>
  144. /// </returns>
  145. public int Compare(object x, object y)
  146. {
  147. string sX = x.ToString();
  148. string sY = y.ToString();
  149. switch (sortOption)
  150. {
  151. case List2CSVSortBy.Name:
  152. return numericCompare(sX, sY);
  153. case List2CSVSortBy.Length:
  154. if (sX.Length > sY.Length)
  155. {
  156. return 1;
  157. }
  158. if (sY.Length > sX.Length)
  159. {
  160. return -1;
  161. }
  162. if (sY.Length == sX.Length)
  163. {
  164. return 0;
  165. }
  166. break;
  167. case List2CSVSortBy.ValueDate:
  168. return dateCompare(sX, sY);
  169. case List2CSVSortBy.None:
  170. return 0;
  171. default:
  172. return 0;
  173. }
  174. return 0;
  175. }
  176. private int dateCompare(string sX, string sY)
  177. {
  178. DateTime dX;
  179. DateTime dY;
  180. bool xPass = DateTime.TryParse(sX,out dX);
  181. bool yPass = DateTime.TryParse(sY, out dY);
  182. if (xPass == true && yPass == true)
  183. {
  184. return dX.CompareTo(dY);
  185. }
  186. else { return 0; }
  187. }
  188. private static int numericCompare(string sX, string sY)
  189. {
  190. int numberOfDigitsX = 0;
  191. int numberOfDigitsY = 0;
  192. for (int i = 0; i < sX.Length; i++)
  193. {
  194. if (Char.IsNumber(sX[i]) == true) { numberOfDigitsX++; }
  195. else { break; }
  196. }
  197. for (int ix = 0; ix < sY.Length; ix++)
  198. {
  199. if (Char.IsNumber(sY[ix]) == true) { numberOfDigitsY++; }
  200. else { break; }
  201. }
  202. if (numberOfDigitsY > 0 && numberOfDigitsY > 0)
  203. {
  204. int nx = 0;
  205. int ny = 0;
  206. bool xPass = Int32.TryParse(sX.Substring(0, numberOfDigitsX), out nx);
  207. bool yPass = Int32.TryParse(sY.Substring(0, numberOfDigitsY), out ny);
  208. if (xPass == true && yPass == true)
  209. {
  210. if (nx > ny) { return 1; }
  211. if (ny > nx) { return -1; }
  212. else return 0;
  213. }
  214. }
  215. return 0;
  216. }
  217. }
  218. /// <summary>
  219. /// Turns line separated list into c# friendly string array.
  220. /// </summary>
  221. /// <param name="input"></param>
  222. /// <returns></returns>
  223. public static string List2Array(string input)
  224. {
  225. int DesiredWidth = 5; //in columns, not characters
  226. var csvString = new StringBuilder();
  227. csvString.AppendLine("string[] something=");
  228. csvString.AppendLine(" \n\t\t{");
  229. string[] tmpString = input.Split('\n');
  230. int i = 0;
  231. var termLengths = new int[tmpString.Length];
  232. int LongestLine = 0;
  233. foreach (string linus in tmpString)
  234. {
  235. if (linus.Trim().Length > LongestLine)
  236. {
  237. LongestLine = linus.Trim().Length;
  238. }
  239. i++;
  240. }
  241. i = 0;
  242. LongestLine += 2;
  243. foreach (string line in tmpString)
  244. {
  245. if (i%DesiredWidth == 0)
  246. {
  247. csvString.AppendLine();
  248. }
  249. string theTerm = "\"" + line.Trim() + "\"";
  250. csvString.Append("\t\t\t");
  251. csvString.Append(theTerm.PadRight(LongestLine, ' '));
  252. csvString.Append(",");
  253. i++;
  254. }
  255. csvString.Remove(csvString.Length - 1, 1);
  256. csvString.AppendLine();
  257. csvString.Append("\t\t};");
  258. return csvString.ToString();
  259. }
  260. /// <summary>
  261. /// generates c# style code for a float[] array
  262. /// </summary>
  263. /// <param name="input"></param>
  264. /// <param name="dataType"></param>
  265. /// <returns></returns>
  266. public static string List2Array(string input, DataTypes dataType)
  267. {
  268. var sb = new StringBuilder();
  269. string[] tmpString = input.Split('\n');
  270. string prefix = "";
  271. string varName = "myFloat";
  272. switch (dataType)
  273. {
  274. case DataTypes.numeric:
  275. sb.AppendLine("float[] " + varName + " = new float[] ");
  276. sb.AppendLine("\t{");
  277. sb.Append("\t\t");
  278. int i = 0;
  279. foreach (string line in tmpString)
  280. {
  281. if (i > 0)
  282. {
  283. sb.Append(",");
  284. }
  285. sb.Append(line);
  286. i++;
  287. }
  288. sb.AppendLine("\t};");
  289. prefix = "// " + i + " elements.\n";
  290. break;
  291. }
  292. return prefix + sb;
  293. }
  294. }
  295. }