【前端demo】CSVJSON转换器 原生实现:CSV转换为JSON,JSON转换为CSV

文章目录

    • 效果
    • 过程
      • textarea
      • Tooltip提示工具
      • 按钮的min-width
      • 判断输入是否是CSV或JSON
      • JSON与CSV样例
      • JSON转为CSV
      • CSV转为JSON
      • 不足之处
    • 代码
      • HTML
      • CSS
      • JS

其他demo

效果

在这里插入图片描述

效果预览:CSV&JSON Converter (codepen.io)

参照的预览:JSV Converter(gpaiva00.github.io)

参考:

gpaiva00/json-csv: 💡 JSON ↔️ CSV Converter(github.com)

JSV Converter(gpaiva00.github.io)

JSON to CSV Converter(codepen.io)

CSV to JSON Converter(codepen.io)

过程

textarea

禁止拉伸

style="resize:none" 

选择textarea中的placeholder:用伪元素

textarea::placeholder{}

选中textarea不出现边框

outline: none;

Tooltip提示工具

CSS 提示工具(Tooltip) | 菜鸟教程 (runoob.com)

效果是这样:鼠标悬停在按钮上就会显示提示。

在这里插入图片描述

其实是:

在这里插入图片描述
代码:https://www.runoob.com/try/try.php?filename=trycss_tooltip_arrow_left

/* tooltip和tooltiptext 鼠标悬停显示提示 */
.tooltip {position: relative;display: inline-block;
}.tooltip .tooltiptext {visibility: hidden;width: 120px;background-color: black;color: #fff;text-align: center;border-radius: 6px;padding: 5px 0;position: absolute;z-index: 1;top: -5px;left: 110%;
}.tooltip .tooltiptext::after {content: "";position: absolute;top: 50%;right: 100%;margin-top: -5px;border-width: 5px;border-style: solid;border-color: transparent black transparent transparent;
}
.tooltip:hover .tooltiptext {visibility: visible;
}

.tooltip .tooltiptext::after是向左指的小箭头:

在这里插入图片描述

在这里插入图片描述

按钮的min-width

设置按钮min-width:如果是width:10vw,当窗口压缩到很小时,里面的字就压缩到看不到了 。

min-width: 10vw;

在这里插入图片描述

判断输入是否是CSV或JSON

要判断输入的CSV或JSON是否是对应类型,不是的话就alert提示,并不予转换。

// 判断是否是CSV或JSON
function judgeCSV(fileContent) {fileContent = fileContent.split(',')if (!fileContent.length) return false;for (let i = 0; i < fileContent.length; i++) {const item = fileContent[i].trim()if (!item.length) return false;}return true;
}function judgeJSON(fileContent) {// 尝试解析,可以解析就是JSON,报错就不是try {JSON.parse(fileContent);return true;} catch (error) {return false;}
}

JSON与CSV样例

JSON:

[{"Id":1,"UserName":"Sam Smith"},
{"Id":2,"UserName":"Fred Frankly"},
{"Id":1,"UserName":"Zachary Zupers"}]

CSV:

Id,UserName
1,Sam Smith
2,Fred Frankly
1,Zachary Zupers

JSON转为CSV

  • 先判断是否是对象,不是的话就把JSON转为对象 JSON.parse()

  • 转为对象后看是否是数组,不是的话就转为数组(a转为数组的方法:[a])

  • '\r\n'是CSV的换行符

  • 先获取表头,即数组对象的key

  • 再获取内容,即所有对象的value

// 将JSON转换为CSV或反之
function JSONtoCSV(fileContent) {// 将JSON转换为对象const jsonInput = typeof fileContent != 'object' ? JSON.parse(fileContent) : fileContent;// 转为数组let arr = Array.isArray(jsonInput) ? jsonInput : [jsonInput];// 表头// 如:{ Id: 1, UserName: 'Sam Smith' } 的表头是 Id,UserNamelet ans = ''let head = Object.keys(arr[0]).join(',')// '\r\n'是CSV的换行符ans += head + '\r\n';// 内容arr.forEach(item => {let temp = Object.values(item).join(',');ans += temp + '\r\n';})console.log(ans)return ans;
}

参考:

最简单的JS实现json转csv - 阿李云 - 博客园
(cnblogs.com)

使用JavaScript 将Json数据导出CSV文件_javascript
json转csv_Blank__的博客-CSDN博客

CSV转为JSON

发现有很好用的库:

JS小知识,如何将 CSV 转换为 JSON 字符串_前端达人的博客-CSDN博客
csvjson CDN by jsDelivr - A CDN for npm and GitHub

然后发现原生引用库好像有点麻烦。所以还是手动实现。

步骤:在 JavaScript 中将 CSV 转换为 JSON | D栈 - Delft Stack

在这里插入图片描述
这里有一个坑,debugger很久才找出来。

参考链接里输入的CSV的,分隔符后有一个空格:, 。因此代码中也是用, 但我输入的CSV中,中没有空格。

// https://www.delftstack.com/zh/howto/javascript/csv-to-json-javascript/
function CSVtoJSON(fileContent) {console.log('------CSVtoJSON------')const array = fileContent.toString().split('\n')const csvToJsonResult = []console.log('array', array)// 表头const headers = array[0].split(',')for (let i = 1; i < array.length; i++) {/* Empty object to store result in key value pair */const jsonObject = {}/* Store the current array element */const currentArrayString = array[i]let string = ''let quoteFlag = 0for (let character of currentArrayString) {if (character === '"' && quoteFlag === 0) {quoteFlag = 1}else if (character === '"' && quoteFlag == 1) quoteFlag = 0if (character === ',' && quoteFlag === 0) character = '|'if (character !== '"') string += character}let jsonProperties = string.split("|")for (let j in headers) {if (jsonProperties[j].includes(",")) {jsonObject[headers[j]] = jsonProperties[j].split(",").map(item => item.trim())}else jsonObject[headers[j]] = jsonProperties[j]}/* Push the genearted JSON object to resultant array */csvToJsonResult.push(jsonObject)}/* Convert the final array to JSON */const json = JSON.stringify(csvToJsonResult);console.log(json)return json
}

不足之处

功能不够严谨,比如输入的CSV是以逗号,分隔,但逗号,后若用空格,理论上应该可以转换为JSON,但这里的代码并不能实现。

可以对输入的CSV预处理一下。

代码

HTML

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSV&JSON Converter</title><link rel="stylesheet" href="style.css"><script src="index.js"></script>
</head><body><div class="main"><div class="input item"><textarea name="" id="inputText" class="inputText" placeholder="请输入CSV或JSON" style="resize:none"></textarea></div><div class="btn"><!-- tooltip和tooltiptext 鼠标悬停显示提示 --><button class="tooltip" onclick="handleConvert('csv')">CSV<span class="tooltiptext">JSON to CSV</span></button><button class="tooltip" onclick="handleConvert('json')">JSON<span class="tooltiptext">CSV to JSON</span></button></div><div class="output item"><textarea name="" id="outputText" class="outputText" readonly style="resize:none"></textarea></div></div>
</body></html>

CSS

body {background-color: #f2efea;
}.main {display: flex;margin-top: 15vh;justify-content: center;align-items: center;width: 100%;height: 60vh;
}.item textarea {width: 400px;height: 350px;background-color: #413e3e;border: 15px solid #525252;border-radius: 20px;padding: 10px;color: white;/* 选中之后不出现边框 */outline: none;
}.item textarea::placeholder {font-size: 16px;
}.btn {display: flex;flex-direction: column;margin: 0 20px;
}.btn button {height: 50px;margin: 15px 0;/* 如果是width:10vw 当窗口压缩到很小时,里面的字就压缩到看不到了 */min-width: 10vw;font-size: 15px;border-radius: 5px;border: 1px solid;color: white;
}/* first-child button的父元素的首个子button */
button:first-child {background-color: #805e73;
}button:nth-child(2) {background-color: #87bcde;
}/* tooltip和tooltiptext 鼠标悬停显示提示 */
.tooltip {position: relative;display: inline-block;
}.tooltip .tooltiptext {visibility: hidden;width: 115px;background-color: black;color: #fff;text-align: center;border-radius: 4px;padding: 4px 0;position: absolute;z-index: 1;top: -5px;left: 110%;
}/* 向左指的小箭头 */
.tooltip .tooltiptext::after {content: "";position: absolute;top: 50%;right: 100%;margin-top: -5px;border-width: 5px;border-style: solid;border-color: transparent black transparent transparent;
}.tooltip:hover .tooltiptext {visibility: visible;
}

JS

// const inputText = document.getElementById('inputText')
// const outputText = document.getElementById('outputText')function handleConvert(index) {const inputText = document.getElementById('inputText')console.log(inputText.value)const fileContent = String(inputText.value).trim()// 若输入为空if (!fileContent.length) return;// JSON to CSVif (index === 'csv') {// 若输入的不是JSON,则清空if (!judgeJSON(fileContent)) {alert('输入的JSON格式错误!');clearFields();return;}const outputResult = JSONtoCSV(fileContent)const outputText = document.getElementById('outputText')outputText.value = outputResult}// CSV to JSONelse {if (!judgeCSV(fileContent)) {alert('输入的CSV格式错误!');clearFields();return;}try {const outputResult = CSVtoJSON(fileContent)const outputText = document.getElementById('outputText')outputText.value = outputResult} catch (error) {// alert('输入的CSV格式错误!')return;}}
}// 判断是否是CSV或JSON
function judgeCSV(fileContent) {fileContent = fileContent.split(',')if (!fileContent.length) return false;for (let i = 0; i < fileContent.length; i++) {const item = fileContent[i].trim()if (!item.length) return false;}return true;
}function judgeJSON(fileContent) {// 尝试解析,可以解析就是JSON,报错就不是try {JSON.parse(fileContent);return true;} catch (error) {return false;}
}// 将JSON转换为CSV或反之
function JSONtoCSV(fileContent) {// 将JSON转换为对象const jsonInput = typeof fileContent != 'object' ? JSON.parse(fileContent) : fileContent;// 转为数组let arr = Array.isArray(jsonInput) ? jsonInput : [jsonInput];// 表头// 如:{ Id: 1, UserName: 'Sam Smith' } 的表头是 Id,UserNamelet ans = ''let head = Object.keys(arr[0]).join(',')// '\r\n'是CSV的换行符ans += head + '\r\n';// 内容arr.forEach(item => {let temp = Object.values(item).join(',');ans += temp + '\r\n';})console.log(ans)return ans;
}// https://www.delftstack.com/zh/howto/javascript/csv-to-json-javascript/
function CSVtoJSON(fileContent) {console.log('------CSVtoJSON------')const array = fileContent.toString().split('\n')const csvToJsonResult = []console.log('array', array)// 表头const headers = array[0].split(',')for (let i = 1; i < array.length; i++) {/* Empty object to store result in key value pair */const jsonObject = {}/* Store the current array element */const currentArrayString = array[i]let string = ''let quoteFlag = 0for (let character of currentArrayString) {if (character === '"' && quoteFlag === 0) {quoteFlag = 1}else if (character === '"' && quoteFlag == 1) quoteFlag = 0if (character === ',' && quoteFlag === 0) character = '|'if (character !== '"') string += character}let jsonProperties = string.split("|")for (let j in headers) {if (jsonProperties[j].includes(",")) {jsonObject[headers[j]] = jsonProperties[j].split(",").map(item => item.trim())}else jsonObject[headers[j]] = jsonProperties[j]}/* Push the genearted JSON object to resultant array */csvToJsonResult.push(jsonObject)}/* Convert the final array to JSON */const json = JSON.stringify(csvToJsonResult);console.log(json)return json
}// 清空输出框
function clearFields() {outputText.value = ''
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【1++的数据结构】之map与set(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的数据结构】 文章目录 一&#xff0c;前言二&#xff0c;红黑树的概念及其性质三&#xff0c;红黑树的插入四&#xff0c;红黑树的验证五&#xff0c;map与set的封装红黑树迭代器的实现map重载…

卧槽,发现一个Python技术变现神器!

最近收到了很多朋友的留言&#xff0c;几乎全是关于爬虫与逆向破解技术的问题咨询。包括小程序逆向、APP逆向、Web逆向、数据加密、加固解密、cookie防护突破、表单加密、动态签名加密、分包反编译在内的&#xff0c;爬虫逆向相关技术&#xff0c;不断地被无数人反复问及。 看…

spark集成hudi

启动spark-shell spark-shell \ > --jars /opt/software/hudi-spark3.1-bundle_2.12-0.12.0.jar \ > --conf spark.serializerorg.apache.spark.serializer.KryoSerializer\ > --conf spark.sql.extensionsorg.apache.spark.sql.hudi.HoodieSparkSessionExtension2…

RuoYi若依管理系统最新版 基于SpringBoot的权限管理系统

RuoYi是一个后台管理系统&#xff0c;基于经典技术组合&#xff08;Spring Boot、Apache Shiro、MyBatis、Thymeleaf&#xff09;主要目的让开发者注重专注业务&#xff0c;降低技术难度&#xff0c;从而节省人力成本&#xff0c;缩短项目周期&#xff0c;提高软件安全质量。 本…

如何短期通过PMP考试?(含pmp干货)

一般PMP的准备考试时间都是一个月到三个月之间&#xff0c;一般都不会花超过半年的时间去准备考试的&#xff0c;毕竟想要学习项目管理的人一般应该都还是讲究高效率的&#xff0c;对待考试肯定也是在短时间内去高效学习备考的。 但对于怎样在短期内能够极好的去迎战PMP考试&a…

EasyRecovery易恢复2023最新免费的电脑数据恢复软件

EasyRecovery是一款非常专业的硬盘数据恢复工具&#xff0c;EasyRecovery拥有磁盘诊断、数据恢复、文件修复、E-mail 修复等功能。有了EasyRecovery&#xff0c;你可以把误删&#xff0c;被破坏的文件&#xff0c;格式化的磁盘轻轻松松的找回来。小伙伴们可以使用EasyRecovery恢…

debian apt安装mysqlodbc

mysql的deb包下载地址 下载后上传到linux后&#xff0c; #安装deb包 apt install ./mysql-apt-config_0.8.26-1_all.deb #更新源 apt-get update #搜索包 apt search odbc #安装包 apt-get install mysql-connector-odbc

统一潮流控制器 (UPFC) 的应用,以增强电力系统中的电压稳定性(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

macOS Ventura 13.5.2(22G91)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;下载请百度搜索&#xff1a;黑果魏叔&#xff09; 黑果魏叔 9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 本次更新查…

geek完全卸载sqlserver2012

前言 有时候sqlserver2012 出现问题&#xff0c;需要卸载安装 会出现卸载不干净的问题 需要用到geek去卸载 卸载 双击exe打开软件 输入sql查询相关的软件 依次一个一个的去删除

抖音无需API开发连接Stable Diffusion,实现自动根据评论区的指令生成图像并返回

抖音用户使用场景&#xff1a; 随着AI绘图的热度不断升高&#xff0c;许多抖音达人通过录制视频介绍不同的AI工具&#xff0c;包括产品背景、使用方法以及价格等&#xff0c;以吸引更多的用户。其中&#xff0c;Stable Diffusion这款产品受到了许多博主达人的青睐。在介绍这款产…

【Redis】Bitmap 使用及应用场景

前言&#xff1a;bitmap 占用空间小&#xff0c;查询效率高&#xff0c;在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值&#xff0c;可以设为 1 或 0 例如 SETBIT key 10 1&#xff0c;将在 key 对应的 bitmap 中第10位设置为…