From 84594e2fba82fbf7fe5e425a79ec292bc69f5919 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 12:28:31 -0300 Subject: [PATCH] [v10.0.x] PanelInspect: Download CSV without extra blank rows (#71290) PanelInspect: Download CSV without extra blank rows (#71248) (cherry picked from commit 8a6c6c3285093cfea4dd48772ca29df69d6a81a9) Co-authored-by: Juan Cabanas --- packages/grafana-data/src/utils/csv.test.ts | 12 +++--------- packages/grafana-data/src/utils/csv.ts | 13 ++++++++++--- .../app/features/inspector/utils/download.test.ts | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/grafana-data/src/utils/csv.test.ts b/packages/grafana-data/src/utils/csv.test.ts index 0512aca9fa4..183459812ff 100644 --- a/packages/grafana-data/src/utils/csv.test.ts +++ b/packages/grafana-data/src/utils/csv.test.ts @@ -104,9 +104,7 @@ describe('write csv', () => { "sep=, "Time","Value" 1598784913123,1234 - 1598784914123,5678 - - " + 1598784914123,5678" `); }); }); @@ -131,9 +129,7 @@ describe('DataFrame to CSV', () => { const csv = toCSV([dataFrame]); expect(csv).toMatchInlineSnapshot(` ""Time","{label1=""value1"", label2=""value1""}" - 1589455688623,1234 - - " + 1589455688623,1234" `); }); @@ -160,9 +156,7 @@ describe('DataFrame to CSV', () => { const csv = toCSV([dataFrame]); expect(csv).toMatchInlineSnapshot(` ""Time","Value" - 1589455688623,2020-05-14 11:28:08 - - " + 1589455688623,2020-05-14 11:28:08" `); }); }); diff --git a/packages/grafana-data/src/utils/csv.ts b/packages/grafana-data/src/utils/csv.ts index b1121927a2d..61328d51fd1 100644 --- a/packages/grafana-data/src/utils/csv.ts +++ b/packages/grafana-data/src/utils/csv.ts @@ -273,7 +273,8 @@ export function toCSV(data: DataFrame[], config?: CSVConfig): string { }); let csv = config.useExcelHeader ? `sep=${config.delimiter}${config.newline}` : ''; - for (const series of data) { + for (let s = 0; s < data.length; s++) { + const series = data[s]; const { fields } = series; // ignore frames with no fields @@ -313,10 +314,16 @@ export function toCSV(data: DataFrame[], config?: CSVConfig): string { csv = csv + writers[j](v); } } - csv = csv + config.newline; + + if (i !== length - 1) { + csv = csv + config.newline; + } } } - csv = csv + config.newline; + + if (s !== data.length - 1) { + csv = csv + config.newline; + } } return csv; diff --git a/public/app/features/inspector/utils/download.test.ts b/public/app/features/inspector/utils/download.test.ts index cedc191cb15..bb8a68dd05f 100644 --- a/public/app/features/inspector/utils/download.test.ts +++ b/public/app/features/inspector/utils/download.test.ts @@ -37,7 +37,7 @@ describe('inspector download', () => { }, }; - it.each([[dataFrameFromJSON(json), 'test', '"time","name","value"\r\n100,a,1\r\n\r\n']])( + it.each([[dataFrameFromJSON(json), 'test', '"time","name","value"\r\n100,a,1']])( 'should, when logsModel is %s and title is %s, resolve in %s', async (dataFrame, title, expected) => { downloadDataFrameAsCsv(dataFrame, title);