JavaScript教程:正确从CSV API获取、解析并填充变量的实践指南

JavaScript教程:正确从CSV API获取、解析并填充变量的实践指南

在现代web开发中,从外部api获取数据是常见的任务。当api返回的数据格式为csv时,我们需要特定的工具来解析它,并确保数据能够正确地映射到我们定义的变量中。本教程将以一个具体的案例为例,详细介绍如何使用javascript和papaparse库从csv api获取学校信息,解析数据,并解决变量填充不正确的问题。

1. 环境准备与HTML结构

首先,我们需要一个基本的HTML页面来承载用户输入和触发数据获取的按钮,并引入PapaParse库来处理CSV数据。

            获取学校信息                                // JavaScript 代码将放在这里    

在上述HTML中,我们创建了一个文本输入框 (schoolName) 用于接收用户输入的学校名称,一个按钮 (Get Information) 来触发数据获取函数,并引入了PapaParse库。

2. 数据获取与API调用

getSchoolInformation 函数是整个流程的入口点。它负责从用户界面获取学校名称,并向指定的CSV API发起fetch请求。

// Function to retrieve school informationfunction getSchoolInformation() {  let schoolName = document.getElementById("schoolName").value;  console.log("尝试获取的学校名称:", schoolName); // 调试输出,检查输入值  // 使用 fetch API 从 CSV 文件获取数据  fetch('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv')    .then(response => {      if (!response.ok) {        throw new Error(`HTTP error! status: ${response.status}`);      }      return response.text(); // 将响应体解析为纯文本    })    .then(csvData => {      // 成功获取 CSV 文本后,调用 findSchoolInformation 进行解析和筛选      let schoolInfo = findSchoolInformation(schoolName, csvData);      displaySchoolInformation(schoolInfo); // 显示结果    })    .catch(error => {      console.error('获取或解析数据时发生错误:', error); // 错误处理    });}

要点:

立即学习“Java免费学习笔记(深入)”;

fetch() API用于发起网络请求。它返回一个Promise,成功时.then()链式调用处理响应。response.text() 将响应体解析为文本,因为我们预期接收的是CSV字符串。console.log 是一个非常有用的调试工具,可以帮助我们检查变量的值和程序的执行流程。

3. CSV数据解析与信息查找

findSchoolInformation 函数是核心部分,它接收原始CSV数据和用户输入的学校名称,然后使用PapaParse解析CSV,并根据学校名称筛选出相关信息。

解决变量填充问题的关键在于:确保在访问CSV数据时使用的列名与CSV文件头中的实际列名完全一致。

// Function to find school information based on school namefunction findSchoolInformation(schoolName, csvData) {  // 使用 PapaParse 解析 CSV 数据  let parsedData = Papa.parse(csvData, {    header: true,          // 将第一行作为列头,生成对象数组    skipEmptyLines: true   // 跳过空行  }).data;  let schoolInfo = []; // 用于存储找到的学校信息  // 调试输出:检查解析后的数据结构和列名  if (parsedData.length > 0) {    console.log('解析后的第一行数据示例:', parsedData[0]);    // 开发者应根据此输出确认正确的列名  }  parsedData.forEach(function(row) {    // !!! 关键修正点:使用 CSV 文件中实际的列名 !!!    // 原始 CSV 文件的列名是 "name", "degree_length", "in_state_tuition"    let collegeName = row.name; // 使用点符号访问,更简洁    let degreeLength = row.degree_length;    let tuitionCost = row.in_state_tuition;    // 筛选条件:学校名称存在且与用户输入匹配(不区分大小写)    if (collegeName && collegeName.toLowerCase() === schoolName.toLowerCase()) {      // 对获取到的数据进行类型转换      // 注意:这里将 collegeName 转换为小写是为了存储,如果需要原始大小写,则不应转换      // collegeName = collegeName.toLowerCase();       degreeLength = parseInt(degreeLength);      tuitionCost = parseFloat(tuitionCost);      // 确保转换后的数值有效      if (!isNaN(degreeLength) && !isNaN(tuitionCost)) {        schoolInfo.push({          collegeName: collegeName, // 存储原始或转换后的名称,取决于需求          degreeLength: degreeLength,          tuitionCost: tuitionCost        });      }    }  });  console.log('筛选到的学校信息:', schoolInfo); // 调试输出,检查筛选结果  return schoolInfo;}

要点解析:

Papa.parse(csvData, { header: true, skipEmptyLines: true }): 这是PapaParse的核心用法。header: true 告诉PapaParse将CSV的第一行作为对象的键,这样每一行数据都会被解析成一个JavaScript对象,其属性名就是CSV的列头。列名匹配是关键:原始代码中使用了row[“INSTNM”]等列名,但通过检查CSV文件或其数据结构,可以发现实际的列名是name、degree_length、in_state_tuition。这是导致变量无法正确填充的根本原因。 务必根据实际API返回的CSV文件头来确定正确的列名。点符号访问:row.name 比 row[“name”] 更简洁,推荐使用。数据类型转换:CSV中的所有数据最初都是字符串。parseInt() 和 parseFloat() 用于将字符串转换为对应的数值类型,以便进行计算或比较。isNaN() 用于检查转换结果是否为有效的数字。调试:console.log(‘解析后的第一行数据示例:’, parsedData[0]); 在解析后立即打印第一行数据,可以帮助开发者直观地看到CSV的列名和数据结构,从而快速定位列名不匹配的问题。

4. 结果展示

displaySchoolInformation 函数负责将找到的学校信息输出到控制台。

// Function to display school information in the consolefunction displaySchoolInformation(schoolInfo) {  if (schoolInfo.length === 0) {    console.log("未找到匹配的学校信息。");    return;  }  for (let i = 0; i < schoolInfo.length; i++) {    let collegeName = schoolInfo[i].collegeName;    let degreeLength = schoolInfo[i].degreeLength;    let tuitionCost = schoolInfo[i].tuitionCost;    console.log("学校名称: " + collegeName);    console.log("学制长度: " + degreeLength);    console.log("学费 (州内): $" + tuitionCost.toFixed(2)); // 格式化为两位小数    console.log("------------------------------");  }}

要点:

立即学习“Java免费学习笔记(深入)”;

在循环之前添加对 schoolInfo.length 的检查,可以避免在没有数据时执行循环,并给出友好的提示。toFixed(2) 用于将浮点数格式化为指定小数位数的字符串。

5. 完整代码示例

将上述所有JavaScript代码整合到HTML文件的标签中,即可运行。

            获取学校信息                            // Function to retrieve school information        function getSchoolInformation() {          let schoolName = document.getElementById("schoolName").value;          console.log("尝试获取的学校名称:", schoolName);          fetch('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv')            .then(response => {              if (!response.ok) {                throw new Error(`HTTP error! status: ${response.status}`);              }              return response.text();            })            .then(csvData => {              let schoolInfo = findSchoolInformation(schoolName, csvData);              displaySchoolInformation(schoolInfo);            })            .catch(error => {              console.error('获取或解析数据时发生错误:', error);            });        }        // Function to find school information based on school name        function findSchoolInformation(schoolName, csvData) {          let parsedData = Papa.parse(csvData, {            header: true,            skipEmptyLines: true          }).data;          let schoolInfo = [];          if (parsedData.length > 0) {            console.log('解析后的第一行数据示例:', parsedData[0]);          }          parsedData.forEach(function(row) {            let collegeName = row.name;            let degreeLength = row.degree_length;            let tuitionCost = row.in_state_tuition;            if (collegeName && collegeName.toLowerCase() === schoolName.toLowerCase()) {              degreeLength = parseInt(degreeLength);              tuitionCost = parseFloat(tuitionCost);              if (!isNaN(degreeLength) && !isNaN(tuitionCost)) {                schoolInfo.push({                  collegeName: collegeName,                  degreeLength: degreeLength,                  tuitionCost: tuitionCost                });              }            }          });          console.log('筛选到的学校信息:', schoolInfo);          return schoolInfo;        }        // Function to display school information in the console        function displaySchoolInformation(schoolInfo) {          if (schoolInfo.length === 0) {            console.log("未找到匹配的学校信息。");            return;          }          for (let i = 0; i < schoolInfo.length; i++) {            let collegeName = schoolInfo[i].collegeName;            let degreeLength = schoolInfo[i].degreeLength;            let tuitionCost = schoolInfo[i].tuitionCost;            console.log("学校名称: " + collegeName);            console.log("学制长度: " + degreeLength);            console.log("学费 (州内): $" + tuitionCost.toFixed(2));            console.log("------------------------------");          }        }    

注意事项与总结

验证CSV列名:这是解决此类问题的首要步骤。在处理任何CSV数据时,务必先检查其标题行,确保代码中使用的字段名与实际数据源的列名完全匹配。可以通过在findSchoolInformation函数中添加console.log(‘解析后的第一行数据示例:’, parsedData[0]);来快速查看解析后的数据结构。错误处理:在fetch请求中加入.catch()块是良好的实践,可以捕获网络请求或数据处理过程中可能发生的错误,提高程序的健壮性。数据类型转换:从CSV解析的数据通常都是字符串类型。根据实际需求,需要手动将其转换为数字(parseInt, parseFloat)、布尔值或其他类型。同时,使用isNaN()等函数进行有效性检查是必不可少的。调试工具浏览器开发者工具(F12)中的Console和Network标签页是调试API请求和数据处理逻辑的强大工具。console.log()可以帮助你追踪变量值和程序流程,Network标签页则可以查看API请求的详细信息和原始响应。代码可读性:使用有意义的变量名、适当的注释和清晰的函数职责划分,可以大大提高代码的可读性和可维护性。例如,使用let代替var是现代JavaScript的推荐做法。

通过遵循本教程的步骤和建议,您将能够更有效地从CSV API获取、解析和处理数据,避免常见的变量填充错误,并构建出更加稳定和可靠的Web应用程序。

以上就是JavaScript教程:正确从CSV API获取、解析并填充变量的实践指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1531683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 23:02:44
下一篇 2025年12月20日 23:02:58

相关推荐

  • Vue/Vuetify文本输入框内容溢出检测与提示策略

    在Vue/Vuetify应用中,当文本输入框内容过长导致显示不全时,通过检测元素的clientWidth和scrollWidth可以有效判断内容是否被截断。本文将详细介绍如何利用这一机制,结合watch监听和DOM操作,实现内容溢出检测,并探讨如何在此基础上优化用户体验,例如通过条件性显示工具提示,…

    2025年12月20日
    000
  • JavaScript数据结构与算法优化

    合理选择数据结构和优化算法可显著提升JavaScript性能。数组适合有序操作但频繁增删效率低;对象以字符串为键,读写高效但遍历无序;Map支持任意键类型且保持插入顺序,适合动态场景;Set实现去重,查找插入均为O(1)。算法优化包括减少嵌套循环(如用Map优化两数之和至O(n))、提前终止条件(如…

    2025年12月20日
    000
  • 解决浏览器中大型PDF文件显示问题:从iframe到第三方库的实践指南

    本文旨在解决在浏览器中使用` 在Web开发中,通过 理解问题根源 原始的嵌入方式通常如下: 当example.pdf文件较小时,这种方式通常工作良好。但一旦文件变大,问题便会浮现。 故障排除步骤 在寻求更复杂的解决方案之前,建议首先进行以下基本的故障排除: 检查浏览器控制台日志:打开浏览器的开发者工…

    好文分享 2025年12月20日
    000
  • Vue.js中子组件更新Props的异步性与$nextTick的应用

    在vue.js中,子组件通过`this.$emit`通知父组件更新数据时,该操作是异步的。这意味着,在`this.$emit`调用后立即尝试访问子组件中受父组件更新影响的props值,可能无法获取到最新的数据。本文将深入探讨这一异步行为的原因,并提供一个使用`this.$nexttick`来确保在d…

    2025年12月20日
    000
  • 高效更新HTML大型元素内容:动态加载外部HTML片段

    本文旨在解决在单页应用中,如何更优雅地更新大型HTML元素内容的问题。通过将不同阶段的内容拆分成独立的HTML文件,并利用JavaScript的AJAX技术,实现内容的动态加载和替换,从而避免在JavaScript代码中直接拼接大量HTML字符串,提高代码的可维护性和可读性。 在构建交互式Web应用…

    2025年12月20日
    000
  • Web应用安全:客户端授权的风险与服务器端实现

    客户端授权(如使用`defer`脚本进行重定向)极易被用户绕过,因为它在用户浏览器上运行,可被禁用或修改。这种方法无法有效保护敏感内容。确保web应用安全的关键在于将所有授权逻辑和重定向操作放在服务器端执行,通过会话(session)或jwt等机制在数据发送给用户之前进行严格验证。 在构建Web应用…

    2025年12月20日
    000
  • 解决jQuery侧边栏菜单初始化双击展开问题

    本文旨在解决使用jquery实现可折叠侧边栏菜单时,页面加载后首次展开需要双击的问题。通过分析问题根源——javascript内部状态与ui初始状态不一致,提供调整`toggle`变量初始值的解决方案,确保菜单功能在首次交互时即能正常响应,并附带完整的代码示例和最佳实践建议。 jQuery侧边栏菜单…

    2025年12月20日
    000
  • 解决Hardhat配置中环境变量未定义错误:dotenv加载顺序指南

    本文旨在解决hardhat项目中常见的`referenceerror: api_url_key is not defined`错误。该问题通常源于`dotenv`模块加载顺序不当,导致环境变量在被引用时尚未初始化。教程将通过示例代码详细指导如何将`require(‘dotenv&#821…

    2025年12月20日
    000
  • HTML5 汉堡菜单平滑动画实现教程

    本教程旨在指导读者如何使用html、css和javascript创建一个具有平滑过渡效果的汉堡菜单。我们将着重解决传统display: none无法实现动画的问题,转而利用css的transform和transition属性,使菜单能够平滑地滑动进出页面,同时配合javascript进行类切换,并实…

    2025年12月20日
    000
  • JavaScript与HTML交互中的常见陷阱及优化实践

    本文深入探讨了javascript在操作dom时常见的几个问题,包括事件监听器的正确使用、脚本加载时机、html结构有效性以及现代web开发中的最佳实践。通过分析`getelementbyid`返回`null`等典型错误,提供了避免这些陷阱的解决方案和代码优化建议,旨在提升前端开发的健壮性和可维护性…

    2025年12月20日
    000
  • 使用JavaScript动态管理和渲染对象到HTML表格的教程

    本教程详细介绍了如何使用JavaScript构建一个简单的图书管理系统,通过面向对象的方式定义图书,并将新增的图书对象动态渲染到HTML表格中。文章涵盖了数据模型定义、数据存储、DOM操作以及事件监听,旨在帮助开发者理解如何高效地管理前端数据并实时更新用户界面。 1. 引言:构建动态图书列表 在现代…

    2025年12月20日
    000
  • 客户端授权检查的风险与服务端安全实践

    本文深入探讨了仅依赖客户端javascript进行用户授权检查的固有风险,指出这种方法极易被绕过,无法有效保护页面内容。教程强调了服务端授权的绝对必要性,并介绍了会话管理和jwt等主流服务端认证机制,指导开发者如何通过服务端重定向和内容控制来确保用户访问权限,从而构建真正安全的web应用。 在Web…

    2025年12月20日
    000
  • 利用SVG在HTML中实现可交互线条绘制

    针对在html `div` 元素内绘制可交互线条的需求,本文介绍了一种高效且灵活的svg解决方案。通过将svg绝对定位叠加在相对定位的 `div` 上,利用svg的 `line` 元素,不仅能精确连接指定坐标点,还能轻松实现事件绑定和css样式定制,避免了canvas的限制,为构建动态web界面提供…

    2025年12月20日
    000
  • Vue.js 中 v-text-field 文本溢出检测及动态提示实现

    本文详细介绍了如何在 vue.js 应用中,特别是使用 vuetify `v-text-field` 组件时,准确判断输入框内容是否因宽度不足而被截断。通过比较元素的 `clientwidth` 和 `scrollwidth` 属性,文章提供了一种高效的检测机制,并指导开发者如何结合 vue 的响应…

    2025年12月20日
    000
  • 为动态生成的HTML表格实现星级评分功能

    本文档旨在解决在动态生成的HTML表格中实现星级评分功能时遇到的问题。通过用户输入动态生成表格,并为每一行添加星级评分功能。文章将详细介绍如何修改现有的HTML、CSS和JavaScript代码,以确保每个表格行都能独立进行评分,避免评分错乱的问题。主要通过修改radio按钮的id和name属性,使…

    2025年12月20日
    000
  • 构建动态日期计数器:JavaScript setInterval应用指南

    本文将详细指导您如何使用javascript的`setinterval`函数,创建一个实时更新的日期计数器,实现从指定日期开始持续计数的动态效果。通过html结构、css样式和javascript逻辑的结合,您将学会如何计算并展示天、小时、分钟和秒,从而构建一个类似网页中常见的“事件发生至今”的计时…

    2025年12月20日
    000
  • 检测Vue/Vuetify文本输入框内容截断的实用技巧

    在vue/vuetify应用中,当文本输入框内容超出其显示范围时,用户体验会受损。本文将详细介绍如何通过比较dom元素的clientwidth和scrollwidth属性,精确判断文本输入框内容是否被截断,并提供vue 3和vuetify的实现代码,以实现智能的条件显示(如工具提示),从而提升用户交…

    2025年12月20日
    000
  • 清晰高效地更新大型HTML元素内容:一份实用指南

    本文旨在提供一种清晰高效的方法,用于在Web应用中动态更新大型HTML元素的内容。通过将内容分割成独立的HTML文件,并利用JavaScript的AJAX技术进行动态加载,可以有效避免代码冗余,提高可维护性,并提升开发效率。本文将详细介绍具体步骤和示例代码,帮助开发者轻松实现这一目标。 在Web开发…

    2025年12月20日
    000
  • Yup验证中“必须是对象”错误解析与服务器端错误集成

    在yup验证中遇到“必须是对象”的错误通常是由于验证器期望接收一个完整的数据对象,但实际传入了单个字段的值。本文将详细解释此类型不匹配的原因及解决方案,并通过示例代码演示如何正确传递数据进行验证。此外,还将深入探讨如何利用yup的`test`方法和`context`机制,优雅地集成和展示来自服务器端…

    2025年12月20日
    000
  • Angular 15 模板驱动表单:解决单选按钮验证消息不显示问题及默认值设置

    本教程深入探讨了 angular 15 模板驱动表单中单选按钮组验证消息不显示的问题。核心在于 `touched` 属性与 `required` 验证的交互,并提供了移除 `touched` 条件的解决方案。同时,文章还详细介绍了如何在组件中为单选按钮设置默认选中值,确保表单的初始状态符合业务需求,…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信