对读取的Excel文件数据进行拆分并发请求发送到后端服务器

news2024/7/6 21:07:09

首先,我们先回顾一下文件的读取操作:

本地读取Excel文件并进行数据压缩传递到服务器-CSDN博客

第一步:根据以上博客,我们将原先的handleFile方法,改为以下内容:

const handleFile = async(e) => {
    console.time('test')
    const file = e.target.files[0];
    
    const results = await new Promise((resolve,reject) => {
        Papa.parse(file,{
            header:true,
            skipEmptyLines:true,
            complete:resolve, //成功时的回调
            error:reject //失败时的回调
        })
    })

    const data = results.data;
    console.log(data)

};

先对data数据进行打印,获取到一千多行的数据信息

那么如何对1000多条信息进行分组处理呢??? 

因为我们要对数据进行拆分,所以我们可以将此数据分成200个记录为一组的分组操作。

第二步:对数据进行分组操作

const batchSize = 200;
const dataChunks = [];
for(let i=0;i<data.length;i+=batchSize){
    const dataChunks = data.slice(i,i + batchSize);
    dataChunks.push(dataChunks);
}

console.log(data,dataChunks)

第三步:引入eachLimit并对此进行操作

import { eachLimit } from "async"; //引入第三方类库  需要安装

以下的handleFile的全部代码

    const [results,setResults] = useState([]); //保留解析后的数据
    const [progress,setProgress] = useState({completed:0,total:0});
    
    const handleFile = async(e) => {
        console.time('test')
        const file = e.target.files[0];
        
        const results = await new Promise((resolve,reject) => {
            Papa.parse(file,{
                header:true,
                skipEmptyLines:true,
                complete:resolve, //成功时的回调
                error:reject //失败时的回调
            })
        })
 
        const data = results.data;
        console.log(data)

        const batchSize = 200;
        const dataChunks = [];
        for(let i=0;i<data.length;i+=batchSize){
            const dataChunks = data.slice(i,i + batchSize);
            dataChunks.push(dataChunks);
        }

        console.log(data,dataChunks) //输出原先数据以及分组后的数据

        const processData = async(dataChunks) => {
            const totalChunks = dataChunks.length; //总共需要发送的请求次数
            let completedChunks = 0; //已经完成的请求次数
            const resultsArray = []; //保存所有请求的结果

            const notifyProgress = () => {
                setProgress({
                    completed: completedChunks,
                    total: totalChunks,
                })
            }
            await eachLimit(dataChunks,5,async(chunk) => {
                const gzip = pako.gzip(JSON.stringify(chunk),{to:"string"});
                try{
                    const response = await fetch('http://localhost:3000',{
                        method:"POST",
                        body:gzip,
                        headers:{
                            "Content-Type":"application/octet-stream",
                        }
                    });

                    const result = {
                        index:dataChunks.indexOf(chunk),
                        success:response.ok,
                        status:response.status,
                        message:response.statusText,
                    };

                    resultsArray.push(result);
                    completedChunks++;
                    notifyProgress();
                    setResults([...resultsArray]);
                }catch (error){
                    const result = {
                        index:dataChunks.indexOf(chunk),
                        success:false,
                        status:500,
                        message:error.message,
                    };
                    resultsArray.push(result);
                    completedChunks++;
                    notifyProgress();
                    setResults([...resultsArray]);
                }
            });
            console.timeEnd("test")
        }
        await processData(dataChunks);
    };
<input type="file" onChange={handleFile} accept='.csv' />

进度的展示

<h2>进度的展示</h2>
<div>
    Progress: { progress.completed } / { progress.total }
</div>

结果展示

<h2>结果显示</h2>
<ul>
    {results && 
        results.map(result => {
            return <li key={result.index}>
                {result.index} - {result.success.toString()} - {result.status} - {""}
                {result.message}
            </li>
        })
    }
</ul>

此时,我们就可以尝试读取一个文件进行测试

由此看出,我们的顺序并不是按照顺序来排列的,那是因为我们进行请求的并发处理并不代表一定是按照顺序去进行数据的返回,因为可能在请求中,因为网络的问题先请求的操作可能会成为后返回的操作。

而result也是按照一定的批次进行返回的,而不是一条一条返回。

此时,我们点击修改背景颜色的按钮,也会很卡顿,所以这种情况需要在后续进行性能优化。

那么以上就是这些内容,希望对您有所帮助。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…

Python 自动化办公:一键批量生成 PPT

Stata and Python 数据分析 一、导读 在实际工作中&#xff0c;经常需要批量处理Office文件&#xff0c;比如需要制作一个几十页的PPT进行产品介绍时&#xff0c;一页一页地制作不仅麻烦而且格式可能不统一。那么有什么办法可以一键生成PPT呢&#xff1f;Python提供的pptx 包…

常见PCB封装

表面贴片封装 通孔封装 公众号 | FunIO 微信搜一搜 “funio”&#xff0c;发现更多精彩内容。 个人博客 | blog.boringhex.top

Web 开发 1: Flask 框架介绍和使用

在 Web 开发中&#xff0c;Flask 是一个流行且灵活的 Python Web 框架&#xff0c;用于构建 Web 应用程序。它简洁而易于上手&#xff0c;适用于小型到中型的项目。在本篇博客中&#xff0c;我将为你介绍 Flask 框架的基础知识和常用技巧&#xff0c;帮助你更好地掌握 Web 开发…

android audio framework

linux ALSA ALSA表示高级Linux声音体系结构(Advanced Linux Sound Architecture)。它由一系列内核驱动&#xff0c;应用程序编译接口(API)以及支持Linux下声音的实用程序组成。 最上层是音频应用和声卡服务&#xff1b;ALSA Library&#xff1a;alsa 提高用户空间访问声卡设备…

【就现在这个市场环境,还是别选游戏开发行业了】

就现在这个市场环境&#xff0c;还是别选游戏开发行业了 最近上网闲逛时我发现&#xff0c;一提到“怎样进入游戏开发行业&#xff1f;”&#xff0c; 大部分都是劝退。 劝退的点大致有以下几点&#xff1a; &#x1f7e5; 游戏开发经常需要加班&#xff0c;尤其是项目快要…

如何在Shopee平台上选择LED产品进行销售的步骤和策略

在如今的电商市场中&#xff0c;Shopee平台是一个非常受欢迎的在线销售平台。如果您计划在Shopee上销售LED产品&#xff0c;那么了解如何选择合适的产品是至关重要的。在本文中&#xff0c;我们将为您介绍一些在Shopee平台上选择LED产品进行销售的步骤和策略&#xff0c;以帮助…

防御保护-防火墙

1.防火墙的主要职责&#xff1a; 控制和防护--安全策略&#xff08;本质ACL&#xff09;--防火墙可以根据安全策略来抓取流量之后做出相应的动作 2-4层 2.防火墙分类&#xff1a; 吞吐量&#xff1a;防火墙同一时间处理的数据量 3.防火墙的发展历程 包过滤防火墙 应用代理防…

thinkphp5实战之phpstudy v8环境搭建,解决Not Found找不到路径问题

引言 thinkphp以快速、简约的大道至简的思想广受欢迎&#xff0c;适合开发小型项目。本地环境下&#xff0c;phpstudy v8是一款比较优秀的集成环境软件。部署完项目后&#xff0c;访问的时候傻眼&#xff0c;报错。 解决方案 不要慌&#xff0c;这个是伪静态的原因。选择apach…

【漏洞复现】SpringBlade export-user接口SQL注入漏洞

文章目录 前言声明一、SpringBlade系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建&#xff0c;完全遵循阿里巴巴编码规范。提供基于React和…

乳糖不耐受人群,多喝牛奶,反而降低糖尿病风险?

撰文 | 宋文法 牛奶是生活中常见的饮品&#xff0c;牛奶含有丰富的营养成分&#xff0c;包括蛋白质、钙、维生素D、维生素B等&#xff0c;牛奶的营养成分可以帮助增强人体的体质&#xff0c;提高免疫力&#xff0c;预防疾病。 在中国&#xff0c;奶制品的消费量远低于西方人口&…

大模型学习与实践笔记(十二)

将RAG生成模型部署到openxlab 平台 代码仓库&#xff1a;https://github.com/AllYoung/LLM4opencv 1&#xff1a;创建代码仓库 在 GitHub 中创建存放应用代码的仓库&#xff0c;其代码大致目录树如下&#xff1a; ├─GitHub repo │ ├─app.py # …

云渲染平台在场景渲染作业中提供的优势

​云渲染平台在场景渲染作业中提供的优势不容小觑&#xff0c;它开启了一种高效、便捷且成本可控的渲染流程。通过利用强大的云端计算资源&#xff0c;艺术家和开发者们可以轻松上传他们的项目&#xff0c;并快速得到高质量的渲染结果。这种技术特别适合处理那些对计算能力要求…

技术浪潮中的职业变革:程序员面临的裁员挑战与应对策略

目录 前言 冲破时空壁垒&#xff1a;探索技术变革的酷时代&#xff01; 逆境成长&#xff1a;一个互联网人战胜失业困境的故事 裁员的双面影响&#xff1a;挑战与机遇 应对裁员潮危机&#xff1a;程序员的超级英雄之路 前言 惊人的新闻传来&#xff0c;一对来自中国的工程师…

leetcode第 381 场周赛最后一题 差分,对称的处理

第 381 场周赛 - 力扣&#xff08;LeetCode&#xff09;最后一题3017. 按距离统计房屋对数目 II - 力扣&#xff08;LeetCode&#xff09; dijkstra超时了&#xff0c;看了灵神的解题方法力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff0c;其…

头条文章采集ChatGPT4.0改写软件环境配置教程步骤

大家好&#xff0c;我是淘小白~ 下面给大家整理一下&#xff0c;ChatGPT4.0改写软件环境配置教程 下面是我们拿到的环境配置软件&#xff0c;分别是&#xff1a;117版本的谷歌浏览器&#xff0c;谷歌浏览器驱动&#xff0c;notepad&#xff08;用于打开config.ini&#xff0c…

计算机网络-物理层基本概念(接口特性 相关概念)

文章目录 总览物理层接口特性星火模型给出的相关概念解释&#xff08;仅供参考&#xff09; 总览 求极限传输速率&#xff1a;奈氏准则&#xff0c;香农定理&#xff08;背景环境不一样&#xff09; 编码&#xff1a;数据变成数字信号 调制&#xff1a;数字信号变成模拟信号 信…

go和swoole性能比较

开发效率 Go语言是本质上是静态语言&#xff0c;开发效率稍差&#xff0c;但性能更强&#xff0c;更适合底层软件的开发 Swoole使用PHP语言&#xff0c;动态脚本语言&#xff0c;开发效率最佳&#xff0c;更适合应用软件的开发 IO模型 go语言使用单线程eventloop处理IO事件&…

机器学习-numpy

机器学习–numpy Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。 Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务&#xff0c;使用Numpy比直接使用Python要简洁的多。 Numpy使用ndarray对象来…

提取文案小助手小程序使用方法?

​很多人经常会说文案提取小程序&#xff0c;今天就来说说提取文案小助手如何将视频转化为文本的&#xff01;如何免费提取视频文案&#xff1a; 视频转换文字使用步骤 步骤一 复制你想提取的短视频链接; 步骤二 打开微信客户端搜索 : 文案提取小程序&#xff0c;或者保存下…