这个系列之前的文章:
- 使用某基金网站的API查询基金净值的历史数据
- 如何使用程序将某基金的历史净值导入到本地进行分析
前一篇文章,我们已经把天天基金网上某基金的历史净值,全部通过分页API调用的方式,*载下**到了本地:

用分号分隔的四个字段,分别是:
- 历史日期
- 当天的基金单位净值
- 当天的基金累积净值
- 当天的涨/跌幅
每个text文件存储了一页的API调用结果。
为了便于下一步的统计,我用nodejs,将这些小text文件合并成一个大的text文件。
这个逻辑位于函数mergeFiles里。首先调用fs.readdirSync,采用同步读取的方式,将data文件夹下所有的文件名读取出来,存储在数组subs里,然后遍历这个数组,将每个text文件的内容全部读取出来,存放在变量sWholeContent里。这些文件内容以换行符\n分隔,因此,我在parseFileContent函数里,首先利用\n将每行的内容拆开:

然后再利用";"作为分隔符,读出当天的基金净值历史数据:

最后合并而成的单一text文件如下图所示:

完整代码如下:
const fs = require('fs');
var ValuePerDay = require("../model/ValuePerDay.js");
var fileWriteTool = require("./fileWriteTool.js");
/*
return: an array containing fund value data
*/
function mergeFiles(sFundCode){
let pwd = process.cwd() + "/data";
let sMergedFilePath = pwd + "/" + sFundCode + ".txt";
let aResult = [];
let subs = fs.readdirSync(pwd);
// we don't need to sort explicitly, as readdirSync
// use the same order in file system
for( var i = 0; i < subs.length; i++){
let sFilePath = pwd + "/" + subs[i];
let sWholeContent = fs.readFileSync(sFilePath,'utf-8');
aResult.push(parseFileContent(sWholeContent));
}
fileWriteTool(aResult,sMergedFilePath);
}
function parseFileContent(sContent){
const aLines = sContent.split("\n");
for( var i = 0; i < aLines.length; i++){
const aFundValue = aLines[i].split(";");
const oFundValue = new ValuePerDay(aFundValue[0],
aFundValue[1], aFundValue[2],
formatRate(aFundValue[3]));
return oFundValue;
}
}
function formatRate(sRaw){
if( sRaw === ""){
return 0;
}
return parseFloat(sRaw.replace("%", ""));
}
module.exports = mergeFiles;