Skip to content

Commit 52c2387

Browse files
authored
fix unit conversion and encoding translation for export csv (#78)
Signed-off-by: Ghazwa REHILI <[email protected]>
1 parent c1d919f commit 52c2387

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

src/main/java/org/gridsuite/shortcircuit/server/service/ShortCircuitService.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.transaction.annotation.Transactional;
2424

2525
import java.io.*;
26+
import java.nio.charset.StandardCharsets;
2627
import java.util.*;
2728
import java.util.concurrent.TimeUnit;
2829
import java.util.concurrent.atomic.AtomicReference;
@@ -122,18 +123,28 @@ public byte[] exportToCsv(ShortCircuitAnalysisResult result, List<String> header
122123
List<FaultResult> faultResults = result.getFaults();
123124
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
124125
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
125-
CsvWriterSettings settings = new CsvWriterSettings();
126-
CsvWriter csvWriter = new CsvWriter(zipOutputStream, settings);
127126
zipOutputStream.putNextEntry(new ZipEntry("shortCircuit_result.csv"));
127+
128+
// This code is for writing the UTF-8 Byte Order Mark (BOM) to a ZipOutputStream
129+
// by adding BOM to the beginning of file to help excel in some versions to detect this is UTF-8 encoding bytes
130+
zipOutputStream.write(0xef);
131+
zipOutputStream.write(0xbb);
132+
zipOutputStream.write(0xbf);
133+
134+
CsvWriterSettings settings = new CsvWriterSettings();
135+
CsvWriter csvWriter = new CsvWriter(zipOutputStream, StandardCharsets.UTF_8, settings);
136+
137+
// Write headers to the CSV file
128138
csvWriter.writeHeaders(headersList);
129139

140+
// Write data to the CSV file
130141
for (FaultResult faultResult : faultResults) {
131142
// Process faultResult data
132143
List<String> faultRowData = new ArrayList<>(List.of(
133144
faultResult.getFault().getId(),
134145
enumValueTranslations.getOrDefault(faultResult.getFault().getFaultType(), ""),
135146
"",
136-
Double.toString(faultResult.getPositiveMagnitude())
147+
Double.isNaN(faultResult.getPositiveMagnitude()) ? "" : Double.toString(faultResult.getPositiveMagnitude())
137148
));
138149

139150
List<LimitViolation> limitViolations = faultResult.getLimitViolations();
@@ -149,8 +160,8 @@ public byte[] exportToCsv(ShortCircuitAnalysisResult result, List<String> header
149160

150161
ShortCircuitLimits shortCircuitLimits = faultResult.getShortCircuitLimits();
151162
faultRowData.addAll(List.of(
152-
Double.toString(shortCircuitLimits.getIpMin()),
153-
Double.toString(shortCircuitLimits.getIpMax()),
163+
Double.toString(shortCircuitLimits.getIpMin() / 1000.0),
164+
Double.toString(shortCircuitLimits.getIpMax() / 1000.0),
154165
Double.toString(faultResult.getShortCircuitPower()),
155166
Double.toString(shortCircuitLimits.getDeltaCurrentIpMin()),
156167
Double.toString(shortCircuitLimits.getDeltaCurrentIpMax())
@@ -166,7 +177,7 @@ public byte[] exportToCsv(ShortCircuitAnalysisResult result, List<String> header
166177
faultResult.getFault().getId(),
167178
"",
168179
feederResult.getConnectableId(),
169-
Double.toString(feederResult.getPositiveMagnitude())
180+
Double.isNaN(feederResult.getPositiveMagnitude()) ? "" : Double.toString(feederResult.getPositiveMagnitude())
170181
));
171182
csvWriter.writeRow(feederRowData);
172183
}

src/test/java/org/gridsuite/shortcircuit/server/ShortCircuitAnalysisControllerTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,19 @@ public void runTest() throws Exception {
463463
byte[] unzippedCsvFile = unzip(zipFile);
464464
String unzippedCsvFileAsString = new String(unzippedCsvFile, StandardCharsets.UTF_8);
465465
List<String> actualCsvLines = List.of(Arrays.asList(unzippedCsvFileAsString.split("\n")).get(0).split(","));
466-
List<String> expectedLines = new ArrayList<>(CSV_HEADERS);
466+
// Including "\uFEFF" indicates the UTF-8 BOM at the start
467+
List<String> expectedLines = List.of(
468+
"\uFEFFID nœud",
469+
"Type",
470+
"Départs",
471+
"Icc (kA)",
472+
"Type de limite",
473+
"Icc min (kA)",
474+
"IMACC (kA)",
475+
"Pcc (MVA)",
476+
"Icc - Icc min (kA)",
477+
"Icc - IMACC (kA)"
478+
);
467479
assertEquals(expectedLines, actualCsvLines);
468480

469481
// should throw not found if result does not exist

0 commit comments

Comments
 (0)