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

如何在Python/Node.js中转换CSV为带正确数据类型的JSON?

实现CSV到带类型JSON的转换(Node.js)

核心逻辑

CSV结构规则:

  • 第1行:字段名(支持300+属性)
  • 第2行:对应字段的数据类型(仅string/number/boolean三种)
  • 第3行及以后:数据行

空值处理规则:

  • 字符串类型字段:空值(空字符串)返回null
  • 数字类型字段:空值返回0
  • 布尔类型字段:空值返回false

实现步骤:

  1. 读取CSV文件,用流式解析避免内存溢出
  2. 捕获字段名行和类型定义行
  3. 对每一行数据,按对应字段的类型完成值转换与空值处理
  4. 收集转换后的数据,最终输出JSON

依赖选择

使用csv-parser库,轻量且支持流式处理,适合大文件和多属性场景。先安装依赖:

npm install csv-parser

完整代码实现

const fs = require('fs');
const csv = require('csv-parser');

// 类型转换与空值处理函数
const convertValue = (value, type) => {
  // 处理空字符串情况
  if (value === '') {
    switch (type) {
      case 'string':
        return null;
      case 'number':
        return 0;
      case 'boolean':
        return false;
      default:
        return value;
    }
  }

  // 非空值类型转换
  switch (type) {
    case 'number':
      const num = Number(value);
      return isNaN(num) ? 0 : num; // 非数字格式内容默认转0,可按需调整
    case 'boolean':
      return value.toLowerCase() === 'true'; // 仅"true"转true,其他转false
    case 'string':
    default:
      return value;
  }
};

const csvToTypedJson = (csvFilePath) => {
  return new Promise((resolve, reject) => {
    const results = [];
    let headers = [];
    let types = [];
    let rowCount = 0;

    fs.createReadStream(csvFilePath)
      .pipe(csv({ headers: false })) // 手动处理表头,因为第二行是类型
      .on('data', (row) => {
        rowCount++;
        if (rowCount === 1) {
          // 第一行是字段名
          headers = Object.values(row);
        } else if (rowCount === 2) {
          // 第二行是类型定义
          types = Object.values(row);
        } else {
          // 数据行处理
          const typedRow = {};
          headers.forEach((header, index) => {
            const rawValue = row[index];
            const type = types[index];
            typedRow[header] = convertValue(rawValue, type);
          });
          results.push(typedRow);
        }
      })
      .on('end', () => {
        resolve(JSON.stringify(results, null, 2));
      })
      .on('error', (err) => {
        reject(err);
      });
  });
};

// 使用示例
csvToTypedJson('./data.csv')
  .then(json => {
    console.log(json);
    // 写入输出文件
    fs.writeFileSync('./output.json', json);
  })
  .catch(err => {
    console.error('转换失败:', err);
  });

测试示例

输入CSV(data.csv)

username,age,isVerified,email
string,number,boolean,string
John Doe,,true,
Jane Smith,28,,jane@example.com
,,false,

输出JSON(output.json)

[
  {
    "username": "John Doe",
    "age": 0,
    "isVerified": true,
    "email": null
  },
  {
    "username": "Jane Smith",
    "age": 28,
    "isVerified": false,
    "email": "jane@example.com"
  },
  {
    "username": null,
    "age": 0,
    "isVerified": false,
    "email": null
  }
]

注意事项

  • 确保类型行的类型值严格为string/number/boolean,若需支持其他类型(如date),可扩展convertValue函数的分支逻辑
  • 流式处理适合大体积CSV文件,300+属性的场景下性能不受影响
  • 数字转换时,若遇到非数字格式的非空值(如"abc"),当前代码默认返回0,可根据业务需求改为抛出错误或保留原始值
  • 布尔类型转换仅识别大小写的"true"为true,其他非空值均返回false,可按需调整判断逻辑

内容的提问来源于stack exchange,提问作者JameyPlay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:31:05