我有一个名为Application.txt的文档,其中包含多个列和行,如此
ApplNo DocsURL DocDate
4782 www…. 7/28/2003
4782 www…. 11/23/2008
4782 www…. 3/24/2012
5010 www…. 4/5/2003
5010 www…. 3/16/2008
5010 www…. 3/12/2013
6002 www…. 6/29/2009
6002 www…. 4/20/2011
我需要为每个ApplNo值找到最新的Doc Date,并将整行保存到txt文件中。因此,例如,我的代码应该遍历文档并将此输出返回到文本文件
ApplNo DocsURL DocDate
4782 www…. 3/24/2012
5010 www…. 3/12/2013
6002 www…. 4/20/2011
我目前这样做是为了阅读文档中的行
var dataFilename = config.file_path + '/datafiles/Application.txt';
console.log("Input file = " + dataFilename);
fs.createReadStream(dataFilename).pipe(parser);
但是,我不确定从哪里开始。我刚刚从节点js开始。
我做了一些研究,看到mongoose js是一个不错的选择,使用类似的东西
var Object = new Schema({
ApplNo: Number
, DocsURL: String
, DocDate: Date
});
Object.findOne({}, {}, { sort: { 'created_at' : -1 } },function(err,post{
console.log( post );
});
但我不确定如何将我的文本文档读入Schema,或者此方法是否会输出包含每个应用程序编号的最新日期的行。
任何帮助或指导将不胜感激。
答案 0 :(得分:0)
因为看起来nobodys回答这个问题我试一试(对于nodejs来说也是新手)。 所以看起来我们可以像这样得到一个字符串流:
var readable=fs.createReadStream(dataFilename);
readable.setEncoding("utf-8");
readable.on('data', (chunk) => {
//chunk should be a part of a string
console.log(chunk);
});
readable.on("end",()=>console.log("end"));
所以现在我们需要将它存储在某个地方,并将其拆分为" "并将其分为三个:
var temp="";
var temparray=[];
var result=[];
var readable=fs.createReadStream(dataFilename);
readable.setEncoding("utf-8");
readable.on('data', (chunk) => {
//append the chunk to our string:
temp+=chunk;
//get all completely transfered data
var arr=temp.split(" ");
//replace temp with the last elem:
temp=arr.pop();
//add the rest to our temp array:
temparray=temparray.concat(arr);
//get groups of three
while(temparray.length>=3){
result.push(temparray.splice(0,3));
}
});
readable.on("end",()=>{
console.log("not parsed:"+temp+";"+temparray.join(" "));
result.forEach((row,line)=>console.log(line+":"+row.join(" "));
});
所以结果现在应该是一个有序的数组,就像这样:
var result=[
["5010", "www….", "3/12/2013"]
["6002", "www….", "4/20/2011"]
];
请检查/评论,我会更进一步......
答案 1 :(得分:0)
将整个字符串逐行拆分为数组。
迭代此数组并使用多个空格将每一行拆分为数组。
创建一个应用程序编号为关键字的对象,并比较存储适当数据的日期。
然后最后迭代包含具有最高日期的行的结果对象,并用它做任何你想做的事
var data = `ApplNo DocsURL DocDate
4782 www…. 7/28/2003
4782 www…. 11/23/2008
4782 www…. 3/24/2012
5010 www…. 4/5/2003
5010 www…. 3/16/2008
5010 www…. 3/12/2013
6002 www…. 6/29/2009
6002 www…. 4/20/2011`;
// create array from each line
var lines = data.split('\n');
// remove heading line
lines.splice(0, 1);
// object to store current highest date and line
var appObj = lines.reduce(function(a, c, i) {
// remove extra whitespace and `\r`
var line = c.trim(),
// create array of columns for this line
arr = line.split(' '),
appNum = arr[0],
date = new Date(arr[2]);
if (!a[appNum]) {
// if appNum not previously encountered, create new object
a[appNum] = {line: line, date: date};
} else if (date > a[appNum].date) {
// or update existing appNum if greater date found
a[appNum].date = date;
a[appNum].line = line
}
return a;
}, {});
// iterate object and process results
Object.keys(appObj).forEach(function(appNum) {
console.log('Line with high date for ', appNum, ' is ---- ', appObj[appNum].line)
})