国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大批量數(shù)據(jù)導(dǎo)出csv,平替導(dǎo)出excel性能優(yōu)化解決方案封裝工具類

這篇具有很好參考價值的文章主要介紹了大批量數(shù)據(jù)導(dǎo)出csv,平替導(dǎo)出excel性能優(yōu)化解決方案封裝工具類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

阿丹:

? ? ? ? 有些業(yè)務(wù)邏輯需要在導(dǎo)出非常大量的數(shù)據(jù),幾百甚至幾千萬的數(shù)據(jù)這個時候再導(dǎo)出excel來對于性能都不是很友好,這個時候就需要替換實現(xiàn)思路來解決這個問題。

? ? ? ? 本文章提供了兩種解決的方案,也是兩種從數(shù)據(jù)庫中拿取數(shù)據(jù)的方式一種是原生的jdbc一種是使用mybatis來封裝對象來完成的。文章來源地址http://www.zghlxwxcb.cn/news/detail-793315.html

使用字符串?dāng)?shù)組的導(dǎo)出:

package com.lianlu.export.util;

import org.apache.poi.ss.formula.functions.T;

import java.io.*;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * CSV導(dǎo)出工具類,用于將數(shù)據(jù)列表導(dǎo)出為CSV文件。
 */
public class CSVExportUtil {

    /**
     * 導(dǎo)出CSV文件。
     *
     * @param dataList          需要導(dǎo)出的內(nèi)容,類型為字符串?dāng)?shù)組的列表。
     * @param validationRulesMap 校驗和替換規(guī)則的映射,鍵為列索引,值為一個映射,其中鍵為需要替換的字符串,值為替換后的字符串。
     * @param headers           CSV文件的表頭,類型為字符串?dāng)?shù)組。
     * @param fileName          導(dǎo)出CSV文件的名稱。
     * @throws IOException 如果在寫入文件過程中發(fā)生異常。
     */
    public static void exportCSV(List<String[]> dataList, Map<Integer, Map<String, String>> validationRulesMap, String[] headers, String fileName) throws IOException {
        // 預(yù)處理數(shù)據(jù)(校驗和替換)
        List<String[]> preprocessedDataList = preprocessData(dataList, validationRulesMap);

        // 寫入CSV文件
        writeCSVToFile(preprocessedDataList, headers, fileName);
    }

    /**
     * 不需要替換規(guī)則的導(dǎo)出
     * @param dataList
     * @param headers
     * @param fileName
     * @throws IOException
     */
    public static void exportCSV(List<String[]> dataList, String[] headers, String fileName) throws IOException {
        // 寫入CSV文件
        writeCSVToFile(dataList, headers, fileName);
    }

        /**
         * 預(yù)處理數(shù)據(jù)列表(校驗和替換)。
         *
         * @param dataList          原始數(shù)據(jù)列表。
         * @param validationRulesMap 校驗和替換規(guī)則的映射。
         * @return 預(yù)處理后的數(shù)據(jù)列表。
         */
    private static List<String[]> preprocessData(List<String[]> dataList, Map<Integer, Map<String, String>> validationRulesMap) {
        return dataList.stream()
                .map(row -> preprocessDataRow(row, validationRulesMap))
                .collect(Collectors.toList());
    }

    /**
     * 預(yù)處理單行數(shù)據(jù)(校驗和替換)。
     *
     * @param row               單行數(shù)據(jù)。
     * @param validationRulesMap 校驗和替換規(guī)則的映射。
     * @return 預(yù)處理后的單行數(shù)據(jù)。
     */
    private static String[] preprocessDataRow(String[] row, Map<Integer, Map<String, String>> validationRulesMap) {
        for (Map.Entry<Integer, Map<String, String>> entry : validationRulesMap.entrySet()) {
            int columnIndex = entry.getKey();
            Map<String, String> rules = entry.getValue();

            String originalValue = row[columnIndex];
            String replacedValue = rules.getOrDefault(originalValue, originalValue);

            row[columnIndex] = replacedValue;
        }
        return row;
    }

    /**
     * 將預(yù)處理后的數(shù)據(jù)寫入CSV文件。
     *
     * @param dataList   預(yù)處理后的數(shù)據(jù)列表。
     * @param headers    CSV文件的表頭。
     * @param fileName   導(dǎo)出CSV文件的名稱。
     * @throws IOException 如果在寫入文件過程中發(fā)生異常。
     */
    private static void writeCSVToFile(List<String[]> dataList, String[] headers, String fileName) throws IOException {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            // 寫入表頭
            writer.write(String.join(",", headers));
            writer.newLine();

            // 分批寫入數(shù)據(jù)以提高性能
            AtomicInteger counter = new AtomicInteger(0);
            while (counter.get() < dataList.size()) {
                int batchSize = Math.min(10000, dataList.size() - counter.get()); // 每次寫入10000條數(shù)據(jù),可根據(jù)實際需求調(diào)整
                List<String[]> batchData = dataList.subList(counter.get(), counter.get() + batchSize);

                for (String[] dataRow : batchData) {
                    writer.write(String.join(",", dataRow));
                    writer.newLine();
                }
                counter.addAndGet(batchSize);
            }
        }


    }
    /**
     * 從泛型對象中獲取屬性值并轉(zhuǎn)換為字符串?dāng)?shù)組。
     *
     * @param data 泛型對象
     * @return 字符串?dāng)?shù)組,包含對象的屬性值
     */
    private String[] convertObjectToArray(T data) {
        Class<?> clazz = data.getClass();
        Field[] fields = clazz.getDeclaredFields();

        // 獲取對象的所有字段,并設(shè)置它們?yōu)榭稍L問
        for (Field field : fields) {
            field.setAccessible(true);
        }

        String[] rowData = new String[fields.length];

        // 遍歷所有字段,獲取每個字段的值并添加到字符串?dāng)?shù)組中
        for (int i = 0; i < fields.length; i++) {
            try {
                rowData[i] = fields[i].get(data).toString();
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Failed to access field value", e);
            }
        }
        return rowData;
    }





}

通過對象的導(dǎo)出:

package com.lianlu.export.util;


import java.io.*;
import java.lang.reflect.Field;
import java.util.*;

public class CSVExportUtil<T> {

    /**
     * 導(dǎo)出CSV文件。
     *
     * @param dataList       需要導(dǎo)出的數(shù)據(jù)列表(泛型對象列表)
     * @param validationRulesMap 校驗和替換規(guī)則映射(鍵為列索引,值為校驗和替換規(guī)則的映射)
     * @param headers         CSV表頭數(shù)組
     * @param fileName        導(dǎo)出CSV文件的名稱
     * @throws IOException 如果在寫入文件時發(fā)生錯誤
     */
    public void exportCSV(List<T> dataList, Map<Integer, Map<String, String>> validationRulesMap, String[] headers, String fileName) throws IOException {
        // 預(yù)處理數(shù)據(jù)(校驗和替換)
        List<String[]> preprocessedData = preprocessData(dataList, validationRulesMap);

        // 寫入CSV文件
        writeCSV(preprocessedData, headers, fileName);
    }

    /**
     * 預(yù)處理數(shù)據(jù)(校驗和替換)。
     *
     * @param dataList       數(shù)據(jù)列表(泛型對象列表)
     * @param validationRulesMap 校驗和替換規(guī)則映射(鍵為列索引,值為校驗和替換規(guī)則的映射)
     * @return 預(yù)處理后的數(shù)據(jù)(字符串?dāng)?shù)組列表)
     */
    private List<String[]> preprocessData(List<T> dataList, Map<Integer, Map<String, String>> validationRulesMap) {
        List<String[]> preprocessedData = new ArrayList<>(dataList.size());
        for (T data : dataList) {
            String[] rowData = convertObjectToArray(data);
            preprocessedData.add(validateAndReplace(rowData, validationRulesMap));
        }
        return preprocessedData;
    }

    /**
     * 從泛型對象中獲取屬性值并轉(zhuǎn)換為字符串?dāng)?shù)組。
     *
     * @param data 泛型對象
     * @return 字符串?dāng)?shù)組,包含對象的屬性值
     */
    private String[] convertObjectToArray(T data) {
        Class<?> clazz = data.getClass();
        Field[] fields = clazz.getDeclaredFields();

        // 獲取對象的所有字段,并設(shè)置它們?yōu)榭稍L問
        for (Field field : fields) {
            field.setAccessible(true);
        }

        String[] rowData = new String[fields.length];

        // 遍歷所有字段,獲取每個字段的值并添加到字符串?dāng)?shù)組中
        for (int i = 0; i < fields.length; i++) {
            try {
                rowData[i] = fields[i].get(data).toString();
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Failed to access field value", e);
            }
        }

        return rowData;
    }

    /**
     * 根據(jù)提供的校驗和替換規(guī)則對字符串?dāng)?shù)組進(jìn)行校驗和替換。
     *
     * @param rowData   字符串?dāng)?shù)組
     * @param rulesMap 校驗和替換規(guī)則映射(鍵為列索引,值為校驗和替換規(guī)則的映射)
     * @return 校驗和替換后的字符串?dāng)?shù)組
     */
    private String[] validateAndReplace(String[] rowData, Map<Integer, Map<String, String>> rulesMap) {
        for (Map.Entry<Integer, Map<String, String>> entry : rulesMap.entrySet()) {
            int columnIndex = entry.getKey();
            Map<String, String> ruleMap = entry.getValue();
            String currentValue = rowData[columnIndex];
            if (ruleMap.containsKey(currentValue)) {
                rowData[columnIndex] = ruleMap.get(currentValue);
            }
        }
        return rowData;
    }

    /**
     * 將預(yù)處理后的數(shù)據(jù)寫入CSV文件。
     *
     * @param preprocessedData 預(yù)處理后的數(shù)據(jù)(字符串?dāng)?shù)組列表)
     * @param headers          CSV表頭數(shù)組
     * @param fileName         導(dǎo)出CSV文件的名稱
     * @throws IOException 如果在寫入文件時發(fā)生錯誤
     */
    private void writeCSV(List<String[]> preprocessedData, String[] headers, String fileName) throws IOException {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            CSVWriter csvWriter = new CSVWriter(writer);

            // 寫入表頭
            csvWriter.writeNext(headers);

            // 寫入數(shù)據(jù)
            csvWriter.writeAll(preprocessedData);

            csvWriter.close();
        }
    }
}

到了這里,關(guān)于大批量數(shù)據(jù)導(dǎo)出csv,平替導(dǎo)出excel性能優(yōu)化解決方案封裝工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Jmeter(三十一):制造大批量的用戶數(shù)據(jù)數(shù)據(jù)

    Jmeter(三十一):制造大批量的用戶數(shù)據(jù)數(shù)據(jù)

    需求:因測試需要,要造100w用戶數(shù)據(jù),通過用戶名、手機(jī)號、密碼可新增用戶,其中用戶名和電話號碼要求100w用戶不能重復(fù) 要點: 1、通過Bean shell Sampler實現(xiàn)用戶名和手機(jī)號的足夠隨機(jī)。 符合我們常用規(guī)則的手機(jī)號:第一位為1,第二位為3-9,后面的9位為0-9即可。 phone=${_

    2024年02月10日
    瀏覽(25)
  • MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    1. 使用索引優(yōu)化 索引是數(shù)據(jù)庫優(yōu)化最常用也是最重要的手段之一 , 通過索引通常可以幫助用戶解決大多數(shù)的 MySQL 的性能優(yōu)化問題: 1.1?避免索引失效應(yīng)用-全值匹配 該情況下,索引生效,執(zhí)行效率高。 1.2?避免索引失效應(yīng)用-最左前綴法則 1.3?避免索引失效應(yīng)用-其他匹配原則

    2024年02月07日
    瀏覽(24)
  • redis 無占用 兩種方式 清除大批量數(shù)據(jù) lua腳本

    redis存儲了很多無用的key,占用了大量內(nèi)存,需要清除 第一種 (顆粒度較大) lua腳本,刪除某些規(guī)則的key,輸入刪除的key,返回刪除的符合規(guī)則的key的數(shù)量 弊端:顆粒度比較大,發(fā)送一個lua腳本去執(zhí)行,會占用較多時間,堵塞其他redis命令 java代碼 這樣直接刪除,因為規(guī)則有很

    2024年04月28日
    瀏覽(24)
  • 【sgTransfer】自定義組件:帶有翻頁、頁碼、分頁器的穿梭框組件,支持大批量數(shù)據(jù)的穿梭顯示。

    【sgTransfer】自定義組件:帶有翻頁、頁碼、分頁器的穿梭框組件,支持大批量數(shù)據(jù)的穿梭顯示。

    ? 特性: ? 表格寬度可以自定義 翻頁器顯示控件可以自定義 列配置項可以設(shè)置顯示字段列名稱、寬度、字段名 可以配置搜索框提示文本,支持搜索過濾 穿梭框頂部標(biāo)題可以自定義 左右箭頭按鈕文本可以設(shè)置

    2024年02月10日
    瀏覽(22)
  • cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案

    cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案

    cesium目前只提供了entityCluster這個聚合類,使打點聚合更方便快捷的實現(xiàn),但是一般在真正做項目的時候,大家會經(jīng)常碰到成千上萬個甚至幾十萬個點位需要聚合打點,那這時候你如果還是用entity去實現(xiàn)的話,怕是要被用戶按在地上瘋狂摩擦,摩擦。。。?? 我們可以通過模擬

    2024年02月09日
    瀏覽(22)
  • 如何使用python快速將大批量圖片合成為視頻?

    如何使用python快速將大批量圖片合成為視頻?

    由于CSDN大批量導(dǎo)入圖片容易出現(xiàn)亂序,本程序?qū)⒅螆D片轉(zhuǎn)為視頻,便于用視頻的方式展示文件內(nèi)容。 由于圖片名稱復(fù)雜多樣,為便于統(tǒng)一化處理,增強(qiáng)程序的通用性,使用改名程序可以降低手動調(diào)整的復(fù)雜度。 改名之后的效果: 注意此部分的圖片大小仍需要手動修改或輸

    2024年02月04日
    瀏覽(21)
  • 遠(yuǎn)程運(yùn)維大批量IT設(shè)備?向日葵批量部署、分組授權(quán)與安全功能解析

    遠(yuǎn)程運(yùn)維大批量IT設(shè)備?向日葵批量部署、分組授權(quán)與安全功能解析

    數(shù)字化轉(zhuǎn)型的不斷推進(jìn),給予了企業(yè)全方位的賦能,但任何發(fā)展都伴隨著成本與代價,比如在數(shù)字化轉(zhuǎn)型過程中企業(yè)內(nèi)部辦公與外部業(yè)務(wù)所需的不斷增加的IT設(shè)備數(shù)量,就為日常的運(yùn)維工作提出了更大的挑戰(zhàn)。 針對企業(yè)面對海量IT設(shè)備時的運(yùn)維難、效率低、容易出錯等問題,

    2024年02月14日
    瀏覽(23)
  • 使用postman做接口測試傳入大批量動態(tài)參數(shù)的方法

    使用postman做接口測試傳入大批量動態(tài)參數(shù)的方法

    postman是一個非常好用的接口測試工具,而且功能也很強(qiáng)大,今天只簡單說一下使用postman如何對一個接口傳入大批量參數(shù)進(jìn)行測試的方法。 以我測試的平臺為例,我們的平臺是做在線教育平臺的,我模擬的場景是老師有一門課叫ABC,現(xiàn)在需要有1000個學(xué)生加入ABC這門課。我們不

    2024年01月23日
    瀏覽(32)
  • 記一次 OSS 大批量文件下載的實現(xiàn) → bat腳本不好玩!

    記一次 OSS 大批量文件下載的實現(xiàn) → bat腳本不好玩!

    一天夜里,侄女跟我哥聊天 侄女一臉期待的看著我哥:爸爸,你說媽媽和奶奶誰漂亮啊? 我哥不慌不忙的拿起一粒瓜子,輕聲說道:為啥沒有你?。?侄女笑容漸起,似乎得到了她想要的回答,仍繼續(xù)問道:那媽媽和奶奶還有我,誰漂亮? 我哥瞄了一眼侄女,又拿起一粒瓜子

    2024年02月05日
    瀏覽(20)
  • ZooKeeper+Kafka+ELK+Filebeat集群搭建實現(xiàn)大批量日志收集和展示

    ZooKeeper+Kafka+ELK+Filebeat集群搭建實現(xiàn)大批量日志收集和展示

    大致流程:將nginx 服務(wù)器(web-filebeat)的日志通過filebeat收集之后,存儲到緩存服務(wù)器kafka,之后logstash到kafka服務(wù)器上取出相應(yīng)日志,經(jīng)過處理后寫入到elasticsearch服務(wù)器并在kibana上展示。 一、集群環(huán)境準(zhǔn)備 二、搭建zookeeper集群 前提條件:三臺機(jī)器分別修改時區(qū)、關(guān)閉防火墻

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包