file_export.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import _ from 'lodash';
  2. import moment from 'moment';
  3. import { saveAs } from 'file-saver';
  4. const DEFAULT_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZ';
  5. const POINT_TIME_INDEX = 1;
  6. const POINT_VALUE_INDEX = 0;
  7. export function convertSeriesListToCsv(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
  8. var text = (excel ? 'sep=;\n' : '') + 'Series;Time;Value\n';
  9. _.each(seriesList, function(series) {
  10. _.each(series.datapoints, function(dp) {
  11. text +=
  12. series.alias + ';' + moment(dp[POINT_TIME_INDEX]).format(dateTimeFormat) + ';' + dp[POINT_VALUE_INDEX] + '\n';
  13. });
  14. });
  15. return text;
  16. }
  17. export function exportSeriesListToCsv(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
  18. var text = convertSeriesListToCsv(seriesList, dateTimeFormat, excel);
  19. saveSaveBlob(text, 'grafana_data_export.csv');
  20. }
  21. export function convertSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
  22. let text = (excel ? 'sep=;\n' : '') + 'Time;';
  23. // add header
  24. _.each(seriesList, function(series) {
  25. text += series.alias + ';';
  26. });
  27. text = text.substring(0, text.length - 1);
  28. text += '\n';
  29. // process data
  30. seriesList = mergeSeriesByTime(seriesList);
  31. var dataArr = [[]];
  32. var sIndex = 1;
  33. _.each(seriesList, function(series) {
  34. var cIndex = 0;
  35. dataArr.push([]);
  36. _.each(series.datapoints, function(dp) {
  37. dataArr[0][cIndex] = moment(dp[POINT_TIME_INDEX]).format(dateTimeFormat);
  38. dataArr[sIndex][cIndex] = dp[POINT_VALUE_INDEX];
  39. cIndex++;
  40. });
  41. sIndex++;
  42. });
  43. // make text
  44. for (var i = 0; i < dataArr[0].length; i++) {
  45. text += dataArr[0][i] + ';';
  46. for (var j = 1; j < dataArr.length; j++) {
  47. text += dataArr[j][i] + ';';
  48. }
  49. text = text.substring(0, text.length - 1);
  50. text += '\n';
  51. }
  52. return text;
  53. }
  54. /**
  55. * Collect all unique timestamps from series list and use it to fill
  56. * missing points by null.
  57. */
  58. function mergeSeriesByTime(seriesList) {
  59. let timestamps = [];
  60. for (let i = 0; i < seriesList.length; i++) {
  61. let seriesPoints = seriesList[i].datapoints;
  62. for (let j = 0; j < seriesPoints.length; j++) {
  63. timestamps.push(seriesPoints[j][POINT_TIME_INDEX]);
  64. }
  65. }
  66. timestamps = _.sortedUniq(timestamps.sort());
  67. for (let i = 0; i < seriesList.length; i++) {
  68. let seriesPoints = seriesList[i].datapoints;
  69. let seriesTimestamps = _.map(seriesPoints, p => p[POINT_TIME_INDEX]);
  70. let extendedSeries = [];
  71. let pointIndex;
  72. for (let j = 0; j < timestamps.length; j++) {
  73. pointIndex = _.sortedIndexOf(seriesTimestamps, timestamps[j]);
  74. if (pointIndex !== -1) {
  75. extendedSeries.push(seriesPoints[pointIndex]);
  76. } else {
  77. extendedSeries.push([null, timestamps[j]]);
  78. }
  79. }
  80. seriesList[i].datapoints = extendedSeries;
  81. }
  82. return seriesList;
  83. }
  84. export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
  85. let text = convertSeriesListToCsvColumns(seriesList, dateTimeFormat, excel);
  86. saveSaveBlob(text, 'grafana_data_export.csv');
  87. }
  88. export function exportTableDataToCsv(table, excel = false) {
  89. var text = excel ? 'sep=;\n' : '';
  90. // add header
  91. _.each(table.columns, function(column) {
  92. text += (column.title || column.text) + ';';
  93. });
  94. text += '\n';
  95. // process data
  96. _.each(table.rows, function(row) {
  97. _.each(row, function(value) {
  98. text += value + ';';
  99. });
  100. text += '\n';
  101. });
  102. saveSaveBlob(text, 'grafana_data_export.csv');
  103. }
  104. export function saveSaveBlob(payload, fname) {
  105. var blob = new Blob([payload], { type: 'text/csv;charset=utf-8' });
  106. saveAs(blob, fname);
  107. }