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

如何修改OHCLV数据加载函数,仅返回CSV最后N行数据?

实现OHCLV数据异步加载函数的最后N条数据返回功能

我有一个从CSV加载OHCLV数据的异步函数,目前能正常获取并返回全部数据。现在需要给它新增参数N,让函数可以仅返回最后N条数据(比如从1000条里返回最后100条)。我考虑用类似cdata.length - NumberValue的方式处理,求具体实现方案。

CSV示例格式

date,open,high,low,close,volume
2013-03-25 16:00:00,76.31,77.5,76.31,77.5,117.65500211
2013-03-25 16:15:00,77.61,77.89,77.1,77.1,36.04786927
[...]
2022-12-22 17:15:00,16646.0,16649.0,16611.0,16623.0,37.57992574
2022-12-22 17:30:00,16626.0,16626.0,16585.0,16608.0,14.26339254

当前函数代码

const getOHCLVData = async (path) => {
  const res  = await fetch(path);
  const resp = await res.text();
  const cdata = resp.split('\n').slice(1).map((row) => {   // slice(1) skip the header
    const [date, open, high, low, close, volume] = row.split(',');
    return {
      time: new Date(`${date}`).getTime() / 1000,
      open: open,
      high: high,
      low: low,
      close: close,
      volume: volume,
    };
  });
  return cdata;
};

// Call function
getOHCLVData('myfile.csv')

实现方案

核心思路

在保留原有功能的基础上,新增可选参数N,通过截取数据行的最后N条来实现需求,同时处理边界情况(如N大于数据总量、N无效),并优化数据类型转换。

修改后的完整代码

const getOHCLVData = async (path, N) => {
  const res = await fetch(path);
  const resp = await res.text();
  
  // 分割行并跳过表头,过滤空行避免无效数据
  let rows = resp.split('\n').slice(1).filter(row => row.trim() !== '');
  
  // 处理N参数:仅当N为有效正数时截取最后N行
  if (typeof N === 'number' && N > 0) {
    const startIndex = Math.max(0, rows.length - N);
    rows = rows.slice(startIndex);
  }
  
  // 转换为OHCLV对象,并将数值字段转为数字类型
  const cdata = rows.map((row) => {
    const [date, open, high, low, close, volume] = row.split(',');
    return {
      time: new Date(date).getTime() / 1000,
      open: parseFloat(open),
      high: parseFloat(high),
      low: parseFloat(low),
      close: parseFloat(close),
      volume: parseFloat(volume),
    };
  });
  
  return cdata;
};

// 调用示例
// 返回全部数据
getOHCLVData('myfile.csv');
// 返回最后100条数据
getOHCLVData('myfile.csv', 100);

关键细节说明

  • 兼容原有调用:N设为可选参数,不传入时仍返回全部数据,无需修改旧代码。
  • 边界处理:用Math.max(0, rows.length - N)确保截取起始索引不会为负数,当N超过数据总量时自动返回全部数据。
  • 性能优化:在转换为对象前先截取目标行,避免对不需要的数据进行对象转换操作。
  • 数据类型修正:通过parseFloat()将CSV中字符串格式的数值转为数字,符合OHCLV数据的实际使用场景。
  • 空行过滤:添加filter(row => row.trim() !== '')处理CSV末尾可能存在的空行,避免生成无效对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:20:44