JavaScript从实时请求解析CSV

要在JavaScript中获取和解析CSV,调用await fetch(url),用await response.text()读取正文,并将行分割为对象。对来自可信来源、具有固定模式的小型CSV文件使用此模式。原生浏览器API无需依赖项即可使请求和解析流程可见。200响应仅确认传输;正文仍可能是HTML或格式错误的逗号分隔值。

JavaScript从URL解析CSV示例

输出:

输出将显示在这里...

输出:

[
  {
    "name": "Ada",
    "city": "London"
  },
  {
    "name": "Lin",
    "city": "Oslo"
  }
]

示例工作原理

  1. await fetch(url)执行浏览器GET请求。web.run的JavaScript执行器在async函数内运行代码,因此顶层await无需包装请求即可工作。
  2. response.ok检查会在收到的HTTP错误的正文到达CSV解析器之前将其阻止。fetch()对于404和500等状态也会解析,因此单独等待它并不能证明成功。
  3. response.text()将正文读取为文本,因为Fetch没有专用于CSV的响应方法。trim()删除fixture的末尾换行符,而slice(1)跳过其name,city标头。
  4. 每个剩余行被分割为namecity,然后作为对象返回。这个紧凑的解析器有意只接受fixture的无引号两列格式。

在Run Details中验证请求

运行示例,然后将Run Details作为检查的一部分进行查看。外部请求显示其GET方法、HTTP状态和持续时间。数字2xx状态算作OK并证明服务器已响应;输出中的预期名称提供了正文按预期解析的单独证据。

数字4xx或5xx意味着服务器以拒绝响应。没有HTTP代码的ERR意味着响应从未到达JavaScript,这指向CORS或其他网络层故障,而不是格式错误的CSV。持续时间测量到fetch()解析为止的请求;读取正文和解析CSV在该测量之后发生。保持await很重要:fire-and-forget的fetch在请求捕获结束时可能仍处于待处理状态。

JavaScript解析CSV的常见陷阱

信任200响应的正文。 response.ok捕获HTTP错误,但无法检测到以状态200返回的HTML登录页面。固定fixture使可运行代码保持简短;对于可变端点,在使用对象之前还要验证预期的标头和行宽度。

对任意CSV按逗号分割。 错误:对不可信的导出使用line.split(',')。正确:仅在有明确的无引号数据约定时使用。像"London, UK"这样的值包含数据逗号,带引号的字段可能包含换行符;简单分割会悄悄改变其含义。

受限解析器 vs CSV库

输入使用方式
小型URL、固定列、保证无引号字段fetch()加受限解析器
带引号的逗号、转义引号、多行字段或不可信CSV浏览器中的Papa Parse或Node.js中的csv-parse
用户选择的文件File.text()FileReader,不用fetch()
大型导出或没有浏览器CORS访问的来源流式处理或服务器端处理

response.text()缓冲整个文件,映射行会分配更多字符串和对象。对于大型导出避免使用此原生模式。渲染到页面时,对远程单元格使用textContent而不是innerHTML;在为电子表格软件导出数据之前也要中和公式前缀。

FAQ

JavaScript有内置的CSV解析器吗?

没有。浏览器JavaScript提供fetch()response.text()用于检索,但CSV语法需要自定义代码或库。只有当接受的方言明确且受控时,小型自定义解析器才合适。

为什么CSV请求会因CORS失败?

浏览器只有在该服务器通过CORS标头授予访问权限时才允许JavaScript读取跨域响应。如果Run Details报告ERR而没有HTTP状态,请在更改解析逻辑之前调试传输和CORS问题。