«Данные CSV в Linux показывают '???' в First Element, но отлично работает в Windows. Как решить проблему?»JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 «Данные CSV в Linux показывают '???' в First Element, но отлично работает в Windows. Как решить проблему?»

Сообщение Anonymous »

Я выполняю свой код в GitHub Actions (среда Linux) и пытаюсь получить данные из файла CSV. Однако первый элемент файла CSV отображается как «???». Интересно, что тот же файл CSV отлично работает в Windows после обработки спецификации (метки порядка байтов). Вот фрагмент кода, который я использую для получения данные из CSV-файла

Код: Выделить всё

public void retrieveCSVFile(String directoryPath, String filename, List csvContent, List extentLog) throws IOException {
File directory = new File(directoryPath);
Collection files = FileUtils.listFiles(directory, new String[]{"csv"}, false);
Optional fileOptional = files.stream().filter(file -> file.getName().contains(filename)).findFirst(); //retrieve the latest file
if (fileOptional.isPresent()) {
File file = fileOptional.get();
validateCsvHeaders(file, csvContent, extentLog);
} else {
extentLog.stream().forEach(Exlog -> Exlog.log(Status.FAIL, filename + " is not present in downloads folder"));
}
}

private static void validateCsvHeaders(File file, List csvContent, List extentLog) {
try (CSVReader csvReader = new CSVReader(new FileReader(file))) {
List header = Arrays.asList(csvReader.readNext());
for (int i = 0; i < header.size(); i++) {
int finalI = i;
if (removeBOMFromCSV(header.get(i)).contains(csvContent.get(i))) {
extentLog.stream().forEach(Exlog -> Exlog.log(Status.PASS, header.get(finalI) + " is present in CSV file: " + csvContent.get(finalI)));
} else {
extentLog.stream().forEach(Exlog -> Exlog.log(Status.INFO, "Expected header is " + header.get(finalI) + " and actual header is" + csvContent.get(finalI)));
extentLog.stream().forEach(Exlog -> Exlog.log(Status.FAIL, header.get(finalI) + " is not present in CSV file" + csvContent.get(finalI)));
}
}

} catch (IOException | CsvValidationException e) {
extentLog.stream().forEach(Exlog -> Exlog.log(Status.FAIL, "Error reading CSV file " + file.getName() + ": " + e.getMessage()));
}
}

public static String removeBOMFromCSV(String s) {
String[] BOMs = {"\uFEFF",      // UTF-8 BOM
"\uFFFE",      // UTF-16 BOM (BE)
"\uFEFF",      // UTF-16 BOM (LE)
"\uFFFE",      // UTF-32 BOM (BE)
"\uFEFF"};     // UTF-32 BOM (LE)
for (String bom : BOMs) {
if (s.startsWith(bom)) {
s = s.substring(bom.length());
s=s.trim();
s = s.replaceAll("[^\\p{Print}]", "");
if(s.startsWith("???\"")){
s=s.substring(4);
}
}
}
return s;
}
Вот как выглядит файл CSV:

Код: Выделить всё

|Age|name|location
|:--|:--:|------:|
|30 |John|India
|25 |Jane|USA
После выполнения кода в GitHub Actions (env = Linux) выводятся следующие данные:

???»Возраст равен отсутствует в CSV-файле


имя присутствует в CSV-файле


Местоположение указано в файле CSV

Ожидаемый результат
< blockquote>
Возраст указан в CSV-файле


имя присутствует в CSV-файле


Местоположение указано в CSV-файле


Подробнее здесь: https://stackoverflow.com/questions/787 ... indows-how
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»