获取文档中的最新日期并输出包含它的行

时间:2017-04-19 15:50:03

标签: javascript jquery node.js date mongoose

我有一个名为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,或者此方法是否会输出包含每个应用程序编号的最新日期的行。

任何帮助或指导将不胜感激。

2 个答案:

答案 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)
})