parse-noquotes.spec.ts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import 'jest';
  4. import { parseDSVNoQuotes as parser } from '../src';
  5. describe('csvviewer/parsenoquotes', () => {
  6. describe('parseDSVNoQuotes', () => {
  7. it('does basic parsing of csv files', () => {
  8. const data = `a,b,c,d\r\n0,1,2,3\r\n4,5,6,7`;
  9. const options = { data };
  10. let results;
  11. results = parser({ ...options, columnOffsets: false });
  12. expect(results.nrows).toEqual(3);
  13. expect(results.ncols).toEqual(0);
  14. expect(results.offsets).toEqual([0, 9, 18]);
  15. results = parser({ ...options, columnOffsets: true });
  16. expect(results.nrows).toEqual(3);
  17. expect(results.ncols).toEqual(4);
  18. expect(results.offsets).toEqual([
  19. 0,
  20. 2,
  21. 4,
  22. 6,
  23. 9,
  24. 11,
  25. 13,
  26. 15,
  27. 18,
  28. 20,
  29. 22,
  30. 24
  31. ]);
  32. });
  33. // For simplicity, we'll use \n as a row delimiter below.
  34. it('handles trailing row delimiter', () => {
  35. const data = `a,b,c,d\n0,1,2,3\n4,5,6,7\n`;
  36. const options = { data, rowDelimiter: '\n' };
  37. let results;
  38. results = parser({ ...options, columnOffsets: false });
  39. expect(results.nrows).toEqual(3);
  40. expect(results.offsets).toEqual([0, 8, 16]);
  41. results = parser({ ...options, columnOffsets: true });
  42. expect(results.nrows).toEqual(3);
  43. expect(results.ncols).toEqual(4);
  44. expect(results.offsets).toEqual([
  45. 0,
  46. 2,
  47. 4,
  48. 6,
  49. 8,
  50. 10,
  51. 12,
  52. 14,
  53. 16,
  54. 18,
  55. 20,
  56. 22
  57. ]);
  58. });
  59. it('handles single-line data', () => {
  60. const data = `a,b,c,d\n`;
  61. const options = { data, rowDelimiter: '\n' };
  62. let results;
  63. results = parser({ ...options, columnOffsets: false });
  64. expect(results.nrows).toEqual(1);
  65. expect(results.offsets).toEqual([0]);
  66. results = parser({ ...options, columnOffsets: true });
  67. expect(results.nrows).toEqual(1);
  68. expect(results.ncols).toEqual(4);
  69. expect(results.offsets).toEqual([0, 2, 4, 6]);
  70. });
  71. it('handles changing the field delimiter', () => {
  72. const data = `a\tb\tc\td\n0\t1\t2\t3\n4\t5\t6\t7\n`;
  73. const options = { data, delimiter: '\t', rowDelimiter: '\n' };
  74. let results;
  75. results = parser({ ...options, columnOffsets: false });
  76. expect(results.nrows).toEqual(3);
  77. expect(results.offsets).toEqual([0, 8, 16]);
  78. results = parser({ ...options, columnOffsets: true });
  79. expect(results.nrows).toEqual(3);
  80. expect(results.ncols).toEqual(4);
  81. expect(results.offsets).toEqual([
  82. 0,
  83. 2,
  84. 4,
  85. 6,
  86. 8,
  87. 10,
  88. 12,
  89. 14,
  90. 16,
  91. 18,
  92. 20,
  93. 22
  94. ]);
  95. });
  96. it('handles starting on a new row', () => {
  97. const data = `a,b,c,d\n0,1,2,3\n4,5,6,7\n`;
  98. const options = { data, rowDelimiter: '\n', startIndex: 8 };
  99. let results;
  100. results = parser({ ...options, columnOffsets: false });
  101. expect(results.nrows).toEqual(2);
  102. expect(results.offsets).toEqual([8, 16]);
  103. results = parser({ ...options, columnOffsets: true });
  104. expect(results.nrows).toEqual(2);
  105. expect(results.ncols).toEqual(4);
  106. expect(results.offsets).toEqual([8, 10, 12, 14, 16, 18, 20, 22]);
  107. });
  108. it('handles a max row argument', () => {
  109. const data = `a,b,c,d\n0,1,2,3\n4,5,6,7\n`;
  110. const options = { data, rowDelimiter: '\n', maxRows: 2 };
  111. let results;
  112. results = parser({ ...options, columnOffsets: false });
  113. expect(results.nrows).toEqual(2);
  114. expect(results.offsets).toEqual([0, 8]);
  115. results = parser({ ...options, columnOffsets: true });
  116. expect(results.nrows).toEqual(2);
  117. expect(results.ncols).toEqual(4);
  118. expect(results.offsets).toEqual([0, 2, 4, 6, 8, 10, 12, 14]);
  119. });
  120. it('handles a start index and max row argument', () => {
  121. const data = `a,b,c,d\n0,1,2,3\n4,5,6,7\n`;
  122. const options = { data, rowDelimiter: '\n', startIndex: 8, maxRows: 1 };
  123. let results;
  124. results = parser({ ...options, columnOffsets: false });
  125. expect(results.nrows).toEqual(1);
  126. expect(results.offsets).toEqual([8]);
  127. results = parser({ ...options, columnOffsets: true });
  128. expect(results.nrows).toEqual(1);
  129. expect(results.ncols).toEqual(4);
  130. expect(results.offsets).toEqual([8, 10, 12, 14]);
  131. });
  132. it('adjusts columns to match first row by default', () => {
  133. const data = `a,b,c,d\n0,\n1,2,3,4,5,6`;
  134. const options = { data, rowDelimiter: '\n' };
  135. let results;
  136. results = parser({ ...options, columnOffsets: false });
  137. expect(results.nrows).toEqual(3);
  138. expect(results.offsets).toEqual([0, 8, 11]);
  139. results = parser({ ...options, columnOffsets: true });
  140. expect(results.nrows).toEqual(3);
  141. expect(results.ncols).toEqual(4);
  142. expect(results.offsets).toEqual([
  143. 0,
  144. 2,
  145. 4,
  146. 6,
  147. 8,
  148. 10,
  149. 10,
  150. 10,
  151. 11,
  152. 13,
  153. 15,
  154. 17
  155. ]);
  156. });
  157. it('adjusts columns to match first row by default with CRLF row delimiter', () => {
  158. const data = `a,b,c,d\r\n0,\r\n1,2,3,4,5,6`;
  159. const options = { data, rowDelimiter: '\r\n' };
  160. let results;
  161. results = parser({ ...options, columnOffsets: false });
  162. expect(results.nrows).toEqual(3);
  163. expect(results.offsets).toEqual([0, 9, 13]);
  164. results = parser({ ...options, columnOffsets: true });
  165. expect(results.nrows).toEqual(3);
  166. expect(results.ncols).toEqual(4);
  167. expect(results.offsets).toEqual([
  168. 0,
  169. 2,
  170. 4,
  171. 6,
  172. 9,
  173. 11,
  174. 11,
  175. 11,
  176. 13,
  177. 15,
  178. 17,
  179. 19
  180. ]);
  181. });
  182. it('adjusts columns to match ncols', () => {
  183. const data = `a,b,c,d\n0,\n1,2,3,4,5,6`;
  184. const options = { data, rowDelimiter: '\n', ncols: 5 };
  185. let results;
  186. results = parser({ ...options, columnOffsets: false });
  187. expect(results.nrows).toEqual(3);
  188. expect(results.offsets).toEqual([0, 8, 11]);
  189. results = parser({ ...options, columnOffsets: true });
  190. expect(results.nrows).toEqual(3);
  191. expect(results.ncols).toEqual(5);
  192. expect(results.offsets).toEqual([
  193. 0,
  194. 2,
  195. 4,
  196. 6,
  197. 7,
  198. 8,
  199. 10,
  200. 10,
  201. 10,
  202. 10,
  203. 11,
  204. 13,
  205. 15,
  206. 17,
  207. 19
  208. ]);
  209. });
  210. it('adjusts columns to match ncols with CRLF row delimiter', () => {
  211. const data = `a,b,c,d\r\n0,\r\n1,2,3,4,5,6`;
  212. const options = { data, rowDelimiter: '\r\n', ncols: 5 };
  213. let results;
  214. results = parser({ ...options, columnOffsets: false });
  215. expect(results.nrows).toEqual(3);
  216. expect(results.offsets).toEqual([0, 9, 13]);
  217. results = parser({ ...options, columnOffsets: true });
  218. expect(results.nrows).toEqual(3);
  219. expect(results.ncols).toEqual(5);
  220. expect(results.offsets).toEqual([
  221. 0,
  222. 2,
  223. 4,
  224. 6,
  225. 7,
  226. 9,
  227. 11,
  228. 11,
  229. 11,
  230. 11,
  231. 13,
  232. 15,
  233. 17,
  234. 19,
  235. 21
  236. ]);
  237. });
  238. it('adjusts columns to match ncols with one row', () => {
  239. const data = `a,b,c,d`;
  240. const options = { data, rowDelimiter: '\n', ncols: 7 };
  241. let results;
  242. results = parser({ ...options, columnOffsets: false });
  243. expect(results.nrows).toEqual(1);
  244. expect(results.offsets).toEqual([0]);
  245. results = parser({ ...options, columnOffsets: true });
  246. expect(results.nrows).toEqual(1);
  247. expect(results.ncols).toEqual(7);
  248. expect(results.offsets).toEqual([0, 2, 4, 6, 7, 7, 7]);
  249. });
  250. it('adjusts columns to match ncols with one row and trailing delimiter', () => {
  251. const data = `a,b,c,d\n`;
  252. const options = { data, rowDelimiter: '\n', ncols: 7 };
  253. let results;
  254. results = parser({ ...options, columnOffsets: false });
  255. expect(results.nrows).toEqual(1);
  256. expect(results.offsets).toEqual([0]);
  257. results = parser({ ...options, columnOffsets: true });
  258. expect(results.nrows).toEqual(1);
  259. expect(results.ncols).toEqual(7);
  260. expect(results.offsets).toEqual([0, 2, 4, 6, 7, 7, 7]);
  261. });
  262. it('handles a single row delimiter', () => {
  263. const data = `\n`;
  264. const options = { data, rowDelimiter: '\n' };
  265. let results;
  266. results = parser({ ...options, columnOffsets: false });
  267. expect(results.nrows).toEqual(1);
  268. expect(results.offsets).toEqual([0]);
  269. results = parser({ ...options, columnOffsets: true });
  270. expect(results.nrows).toEqual(1);
  271. expect(results.ncols).toEqual(1);
  272. expect(results.offsets).toEqual([0]);
  273. });
  274. it('handles adding columns or merging columns as necessary', () => {
  275. const data = `a,b,c\n,c,d,e,f\ng,h`;
  276. const options = { data, rowDelimiter: '\n' };
  277. let results;
  278. results = parser({ ...options, columnOffsets: false });
  279. expect(results.nrows).toEqual(3);
  280. expect(results.offsets).toEqual([0, 6, 15]);
  281. results = parser({ ...options, columnOffsets: true });
  282. expect(results.nrows).toEqual(3);
  283. expect(results.ncols).toEqual(3);
  284. expect(results.offsets).toEqual([0, 2, 4, 6, 7, 9, 15, 17, 18]);
  285. });
  286. });
  287. });
  288. // Helpful debugging logging
  289. // console.log(Array.from(results.offsets));
  290. // console.log(Array.from(results.offsets).map(i => data[i]));
  291. // console.log(Array.from(results.offsets).map((i, ind, arr) => data.slice(i, arr[ind + 1])));