计算转换为 CSV 的列表<String[]>的总大小

问题描述 投票:0回答:1

我有一个清单

List<String[]> csvRows, String[] csvHeaderRow

我的目标是计算我将从这些行中写入的最终 CSV 文件的总大小。所以我应该添加所有逗号的总大小,

csvRows
csvHeaderRow
。请注意,
csvRows
中的许多列可能像
"Rick,,,,15,,4324,,,"
一样为空。
csvHeaderRow
将始终被完全填充。

我可以将这些全部写入

ByteArrayOutputStream
并计算字节数组的长度。但我想编写更高效、更简洁的代码。

最新代码版本:

public void long getNumOfFiles(List<String[]> csvRows, String[] csvHeaderRow){
    long totalSize = csvRows.stream().mapToLong(i -> {
            return Stream.of(i).mapToLong(str -> {
                if (StringUtils.isNotEmpty(str)) {
                    return str.getBytes().length;
                }
                return 0L;
            }).sum();
        }).sum();
        
                totalSize = totalSize + Stream.of(csvHeaderRow).mapToLong(str -> str.getBytes().length).sum();
                totalSize = totalSize + csvHeaderRow.length * csvRows.size() + 1; -> number of commas
                long numOfFiles = (totalSize / MAX_FILE_SIZE_BYTES) + 1;
    return numOfFiles;
}

如何更有效地写这个?

java arrays list csv java-stream
1个回答
0
投票

我不确定你的算法是否正确,但以下是一个更简单的

Stream
解决方案,它返回等效的结果:

long totalSize = Stream.concat(Stream.<String[]>of(csvHeaderRow), csvRows.stream())
        .mapToLong(row ->
                Arrays.stream(row)
                        .mapToInt(s -> s == null ? 0 : s.getBytes().length)
                        .sum()
                + row.length - 1)
        .sum();
totalSize += 1;
return totalSize / MAX_FILE_SIZE_BYTES + 1;

以下解决方案与您的不同,但我认为给出了实际正确的结果(尽管我不确定

MAX_FILE_SIZE_BYTES
除法是什么):

long totalSize = Stream.concat(Stream.<String[]>of(csvHeaderRow), csvRows.stream())
        .mapToLong(row ->
                // Number of characters per row, plus one for each comma
                Arrays.stream(row)
                        .mapToInt(s -> s == null ? 0 : s.getBytes().length)
                        .sum()
                + row.length - 1)
        .sum();
totalSize += csvRows.size() + 1; // Add number of newlines (including trailing one)
return totalSize / MAX_FILE_SIZE_BYTES + 1; // Whatever this is
© www.soinside.com 2019 - 2024. All rights reserved.