parse-noquotes.spec.ts 9.5 KB

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