从.txt文件中提取特定数字

时间:2019-03-15 19:17:52

标签: javascript

我被要求在庞大的随机推文文本文件中,每天(0-23)计算每小时的推文数。日期并不有趣,只有每小时的推文。我想以新的对象数组返回它们。每个对象应具有小时和计数这样的属性:

{hour: x, count: y},

我做了一个函数,在其中声明一个空数组,将数据放入其中:

function(tweets) {
let result = [];

我想我需要这样推动他们:

result.push({hour: x, count: y});

但是我不知道如何从对象(键和值)中提取特定的小时数。

在巨大的原始数据文件中,每个推文都记录有这样的日期:

created_at: "30-06-2015 14:27",

有什么建议或经验吗?我目前正在学习正则表达式和for循环。我应该在代码中使用它们还是有更聪明的方法?

编辑:根据您的要求提供更多详细信息: 原始数据是具有以下结构的数组中的对象:

{
time: Date-object,
created_at: "30-06-2015 14:27",
fromUsername: "victor",
text: "asyl og integration",
lang: "da",
source: "Twitter for Android", }

3 个答案:

答案 0 :(得分:0)

关于提取文本,我看到了很好的答案here。代替console.log来将解析和保存添加到您的数组中。

关于regexp-我认为应该是

var re = /created_at: \"([^\"]*)\",/g;

答案 1 :(得分:0)

我要做的是从另一个角度进行工作: 为您关心的每个小时的开始创建一个带有dateTimeHour的对象。大概应该是有限的时间范围,就像之前发生过的所有推文一样:

因此,动态生成如下所示的内容:

{
'2019-03-01T17:22:30Z': 0, // or simply '1552667443928'
'2019-03-01T18:22:30Z': 0,
'2019-03-01T19:22:30Z': 0,
'2019-03-01T20:22:30Z': 0,
...etc
}

您可以使用当前日期,然后使用循环创建其他以前的日期时间:

const now = new Date()
// you can use a generator here or simply a while loop:
const dateTimes = {}
while(now > REQUIRED_DATE)
   dateTimes[new Date(now.setHours(now.getHours() - 1))] = 0

现在您已经有了所有小时的详尽清单。

然后,检查给定的推文是否在该小时内: 检查是否item.created_at < currentHourBeingLooked,因为您应该遍历Object.keys(dateTimes)

然后,循环遍历列表中的每个项目,并检查是否适合该dateTime(如果递增dateTimes[currentHour]++

)。

因此,最困难的部分是将created_at转换为正常显示日期时间字符串:

const [datePortion, timePortion] = "30-06-2015 14:27".split(' ')
const [day, month, year] = datePortion.split('-')
const [hour, minute] = timePortion.split(':')

现在有了所有这些日期,月份,年份,小时和分钟,您就可以在javascript中建立时间对象: 它遵循以下公式: 来自MDN:

new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

又名:

new Date(year, monthIndex, day, hours, minutes, seconds);

所以对于2019年12月17日上午3:24它将是:

const = new Date(2019, 11, 17, 3, 24, 0);

答案 2 :(得分:0)

我假设您已经知道可以使用Ralkov指出的帖子中的regex来获取您所有的 ... removed some output for clarity ... 2 CMakeLists.txt 2 heads 2 hello 2 info 2 origin 2 refs 2 remotes 2 test 2 test.cpp 4 .gitignore 4 HEAD 4 master 5 Makefile 日期,而我的答案将会是这样。

您说日期并不重要,因此一旦有了字符串

created_at

我们需要除去小时以外的所有内容,我通过提取子字符串来做到这一点,随时尝试其他方法,这只是为了让您入门。

'created_at: "30-06-2015 14:27"'

每小时都会得到

var date = obj.substr(obj.indexOf(' ') + 1);
var time = date.substr(date.indexOf(' ') + 1);
var hour = time.substr(0, time.indexOf(':'));

请注意,这仅适用于一天,如果您想在同一数据结构中存储不同日期的推文小时数,则需要做一些其他更改

每次编写推文并提取"14" 时,使用以下函数编写for循环时,它将值对的组合存储到该函数外部定义的map变量中,从而创建一个新的配对(如有必要),或仅使用新的推文计数进行更新。

hour

完整代码:

function newTweet(hour, tweetsPerHour) {
  var tweetsThisHour = tweetsPerHour.get(hour);
  tweetsThisHour = tweetsThisHour === undefined ? 0 : tweetsThisHour; 
  tweetsPerHour.set(hour, ++tweetsThisHour);
  console.log(tweetsThisHour)
}

代码正在做的是成对存储推文的小时数和计数:

    var obj = 'created_at: "30-06-2015 14:27"';

    var date = obj.substr(obj.indexOf(' ')+1);
    var time = date.substr(date.indexOf(' ')+1);
    var hour = time.substr(0, time.indexOf(':'));

    var tweetsPerHour = new Map();

    newTweet(hour, tweetsPerHour); //this is the extracted hour
    newTweet("16", tweetsPerHour); //you can try different hours as well
    newTweet("17", tweetsPerHour);

    function newTweet(hour, tweetsPerHour) {
      var tweetsThisHour = tweetsPerHour.get(hour);

      tweetsThisHour = tweetsThisHour === undefined ? 0 : tweetsThisHour; 
      tweetsPerHour.set(hour, ++tweetsThisHour);
      console.log(hour + " tweet count: " + tweetsThisHour)
    }

例如,如果您再次添加“ 14”,它将更新为

[{"14":1} ,{"16":1}, {17:1}]

也可以深入研究JavaScript Map Objects。

您的代码流如下所示:

  1. 读取.txt文件
  2. 循环浏览日期->从日期获取小时-> newTweet(小时, tweetsPerHour)。