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

如何用JavaScript将UDP接收的实时赛车数据写入CSV文件?

UDP赛车数据持续写入CSV解决方案

问题拆解

你遇到的两个核心问题:

  • 无法捕获obj变量:通常是属性提取错误或作用域问题,需要确保正确访问解析后的对象属性
  • 无法持续追加写入:需要使用文件系统的追加模式,而不是默认的覆盖模式

分步实现代码

1. 引入依赖模块

确保导入UDP和文件系统核心模块:

const dgram = require('dgram');
const fs = require('fs');
const path = require('path');

2. 初始化CSV文件(写入表头)

首次运行时先写入CSV表头,避免重复写入:

const csvPath = path.join(__dirname, 'race_data.csv');
let hasHeader = false;

// 检查文件是否存在,不存在则写入表头
if (!fs.existsSync(csvPath)) {
  // 替换为你解析后obj的实际属性名
  const headers = ['speed', 'rpm', 'gear', 'lap_time', 'position'];
  fs.writeFileSync(csvPath, headers.join(',') + '\n');
  hasHeader = true;
}

3. 改造UDP接收逻辑,追加数据到CSV

方案一:简单追加(适合低频率数据)

直接用fs.appendFile实现追加,代码简洁:

const udpServer = dgram.createSocket('udp4');

udpServer.on('message', (msg) => {
  // 替换为你的UDP数据解析逻辑
  const raceData = parseUdpRaceData(msg);

  // 将对象属性转为CSV行
  const csvRow = Object.values(raceData).join(',') + '\n';

  // 追加写入文件
  fs.appendFile(csvPath, csvRow, (err) => {
    if (err) console.error('CSV写入失败:', err);
  });
});

// 启动UDP监听(替换为你的端口和地址)
udpServer.bind(3000, '0.0.0.0');

方案二:流式写入(适合高频率数据)

如果数据量较大,用可写流避免频繁文件IO,性能更优:

// 创建追加模式的可写流
const csvStream = fs.createWriteStream(csvPath, { flags: 'a' });
const udpServer = dgram.createSocket('udp4');

udpServer.on('message', (msg) => {
  const raceData = parseUdpRaceData(msg);

  // 首次写入时补全表头(如果之前没写)
  if (!hasHeader) {
    const headers = Object.keys(raceData).join(',') + '\n';
    csvStream.write(headers);
    hasHeader = true;
  }

  // 处理带逗号的字符串值(比如车手名称)
  const values = Object.values(raceData).map(val => 
    typeof val === 'string' && val.includes(',') ? `"${val}"` : val
  );
  const csvRow = values.join(',') + '\n';
  
  csvStream.write(csvRow);
});

// 程序退出时关闭流,避免数据丢失
process.on('SIGINT', () => {
  csvStream.end(() => {
    console.log('CSV流已关闭');
    process.exit(0);
  });
});

udpServer.bind(3000, '0.0.0.0');

关键注意点

  • 确保parseUdpRaceData返回的对象结构稳定,否则CSV列会错位
  • 若包含特殊字符(逗号、引号),要对字段进行转义(如示例中用双引号包裹带逗号的字符串)
  • 避免使用同步写入方法(如writeFileSync),防止阻塞UDP接收线程

内容的提问来源于stack exchange,提问作者MICHAEL I ROTH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:33:11