You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.csv文件转换为以列标题为键的JavaScript字典数组?

如何将CSV文件转换为JavaScript字典数组?

要实现把CSV文件转成以列标题为键、行内容为值的字典数组,核心是拆分CSV的表头和数据行,再将每行数据与表头一一映射。以下分场景给出具体实现:

基础实现(简单CSV,无特殊字符)

如果你的CSV字段不含逗号、引号等特殊字符,可以用最直接的字符串拆分方法:

Node.js 环境

通过fs模块读取文件后处理:

const fs = require('fs');

function csvToDictArray(csvText) {
  // 分割行并过滤空行
  const lines = csvText.split('\n').filter(line => line.trim());
  // 提取表头并去除空格
  const headers = lines[0].split(',').map(header => header.trim());
  
  // 遍历数据行生成字典
  return lines.slice(1).map(line => {
    const values = line.split(',').map(val => val.trim());
    return headers.reduce((obj, header, index) => {
      obj[header] = values[index];
      return obj;
    }, {});
  });
}

// 读取本地CSV文件
fs.readFile('your-file.csv', 'utf8', (err, data) => {
  if (err) throw err;
  const result = csvToDictArray(data);
  console.log(result);
});

浏览器环境

通过文件上传控件读取CSV并处理:

<input type="file" id="csvUpload" accept=".csv">
<script>
function csvToDictArray(csvText) {
  const lines = csvText.split('\n').filter(line => line.trim());
  const headers = lines[0].split(',').map(header => header.trim());
  
  return lines.slice(1).map(line => {
    const values = line.split(',').map(val => val.trim());
    return headers.reduce((obj, header, index) => {
      obj[header] = values[index];
      return obj;
    }, {});
  });
}

document.getElementById('csvUpload').addEventListener('change', (e) => {
  const file = e.target.files[0];
  if (!file) return;
  
  const reader = new FileReader();
  reader.onload = (event) => {
    const csvData = csvToDictArray(event.target.result);
    console.log(csvData);
    // 此处可添加后续业务逻辑
  };
  reader.readAsText(file);
});
</script>

进阶实现(支持含特殊字符的CSV)

如果CSV字段包含逗号、被引号包裹(比如"lorem, ipsum"),直接用split(',')会拆分错误,这时可以用正则匹配CSV的标准格式:

// 解析单行CSV,支持带引号的字段(包括字段内的双引号转义)
function parseCSVLine(line) {
  const regex = /(?:^|,)(?:"([^"]*(?:""[^"]*)*)"|([^,"]*))/g;
  const values = [];
  let match;
  
  while ((match = regex.exec(line)) !== null) {
    let value = match[1] || match[2];
    // 把字段内的双引号转义("" 转为 ")
    if (value) value = value.replace(/""/g, '"');
    values.push(value?.trim() || '');
  }
  
  // 移除正则匹配产生的开头空元素
  if (values[0] === '') values.shift();
  return values;
}

// 改进后的转换函数
function csvToDictArray(csvText) {
  const lines = csvText.split('\n').filter(line => line.trim());
  const headers = parseCSVLine(lines[0]);
  
  return lines.slice(1).map(line => {
    const values = parseCSVLine(line);
    return headers.reduce((obj, header, index) => {
      obj[header] = values[index];
      return obj;
    }, {});
  });
}

用这个进阶版本处理示例中的CSV:

index,id,description,component,service
0,5,lorem ipsum,7326985,Field Service 

会得到如下结果:

[
  {
    index: "0",
    id: "5",
    description: "lorem ipsum",
    component: "7326985",
    service: "Field Service"
  }
]

内容的提问来源于stack exchange,提问作者André Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:05:33