如何修改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
相关产品推荐
相关产品推荐

