Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助在JSON文件(node.js)的列中查找最大值吗_Node.js - Fatal编程技术网

需要帮助在JSON文件(node.js)的列中查找最大值吗

需要帮助在JSON文件(node.js)的列中查找最大值吗,node.js,Node.js,我有一个地球物理学家课程的计算作业;任务基本上是在txt文件的一列中查找最大值(该值是地震的震级,该文件包含1990-2000年的所有地震)。然后把这类地震的纬度和经度绘制成地图。 这项任务在python中非常简单,但由于我花了一些空闲时间来研究webdev,我正在考虑制作一个简单的webapp来完成这项任务 换句话说,我会上传一个文件到它,它会自动指定最大地震到谷歌地图 但是由于我是node.js中的一个noob,我在启动这个项目时遇到了困难,所以我把它分成了几个部分,在第一部分我需要帮助 我

我有一个地球物理学家课程的计算作业;任务基本上是在txt文件的一列中查找最大值(该值是地震的震级,该文件包含1990-2000年的所有地震)。然后把这类地震的纬度和经度绘制成地图。 这项任务在python中非常简单,但由于我花了一些空闲时间来研究webdev,我正在考虑制作一个简单的webapp来完成这项任务

换句话说,我会上传一个文件到它,它会自动指定最大地震到谷歌地图

但是由于我是node.js中的一个noob,我在启动这个项目时遇到了困难,所以我把它分成了几个部分,在第一部分我需要帮助

我正在考虑将带有数据的
txt.file
转换为
.csv
文件,然后将其转换为
.json
文件。我完全不知道应该使用什么算法来扫描
.json
文件并找到给定列的最大值

以下是原始
.txt
文件的第一行:

1 50 7.0 274 102.000-3.000

它位于
.csv
文件上,使用在线转换器:

1 50 7.0 274 102.000-3.000

这里它位于
.json
文件中,同样在在线转换器上使用:

1\t5\t0\t7.0\t274\t102.000\t-3.000

基本上,我需要扫描所有行,并找到第5列的最大值

关于如何开始编写这段代码有什么帮助吗

非常感谢

TLDR版本:


需要在包含多行的JSON文件中查找第5列的最大值。

如果您的文件只包含一行数字,并且具有相同的结构,我不会将其转换为csv或JSON

我只需要手动解析
.txt
。下面是如何实现这一点的代码片段。我使用了两个外部模块:lodash(非常流行的用于数据操作的unility库)和validator(帮助验证字符串):

“严格使用”;
常数fs=要求('fs');
const=require('lodash');
const os=要求('os');
const validator=require('validator');
const parseLine=函数(行){
如果(!行){
抛出新错误(“未通过行”);
}
//将行拆分为令牌
//一些令牌用双空格分隔
//所以在这里使用正则表达式
让tokens=line.split(/\s+/);
//数据验证
如果((
//我允许每行增加7个令牌,但不能减少
令牌和令牌。长度>=7
//还要检查字符串是否包含数字
//因此,它们将被正确解析
&&validator.isDecimal(令牌[4])
&&validator.isDecimal(令牌[5])
&&validator.isDecimal(令牌[6])
)) {
抛出新错误('无法分析行');
}
//解析作为字符串出现的值
返回{
量级:parseFloat(标记[4]),
纬度:parseFloat(标记[5]),
经度:parseFloat(令牌[6])
}
};
//我将编码传递给readFile,因为如果我不
//数据将是一个缓冲区,因此我们必须对其调用.toString('utf8')。
fs.readFile('./data.txt',utf8',(err,data)=>{
如果(错误){
控制台错误(错误堆栈);
犯错误;
}
//使用os.EOL拆分为行
//因此,我们的代码在Linux/Windows/Mac上工作
让行=data.split(os.EOL);
if(!(行和行长度)){
console.log('未找到任何行');
返回;
}
//解析所有行的简单lodash链
//然后找到最大震级的那个
let地震=uu(线)
.map(解析行)
.maxBy(“震级”);
//只需在这里记录
//你可能会把它写进回电/承诺中
//或者从这里发送响应
控制台日志(地震);

});我尝试过这一点,作为一种单排代码高尔夫风格。我将省略通常的“不要让堆栈溢出来为您做家庭作业”这句话。孩子们,这些天你们只是在欺骗自己,雅达雅达

拆分、映射、减少

let data = require('fs').readFileSync('renan/homework/geophysicist_data.txt')

let biggest = data.split('\n')
                  .map(line => line.split(/[ ]+/)[4])
                  .reduce((a, b) => Math.max(a, b))
加载
数据后,我们分3步处理它

  • .split('\n')通过对换行符进行拆分,我们将文本文件分解为一个数组,以便文本文件中的每一行都转换为数组中的一项
  • .map(line=>line.split(/[]+/)[4])“map”获取此行数组,并在每一行上单独运行一个命令。对于每一行,我们告诉它一个或多个空格(
    split(/[]+/)
    )是列分隔符,一旦它被拆分为列,则取该行的第五列(我们使用
    [4]
    而不是
    [5]
    ,因为javascript从0开始计数)
  • .reduce((a,b)=>Math.max(a,b))现在我们有了一个只包含第五列数字的数组,我们可以直接将数组发送到
    Math.max
    ,让它为我们计算答案。万岁 如果这些数据有点不一致,那么很容易打破这一点,但我假设,因为这是一个家庭作业,事实并非如此


    祝你好运

    您想要的csv的标题是什么?您可以使一个对象的键与csv标头相等,并将值作为与该键(标头)关联的值数组。如果选择该路径,则可以使用节点库将
    .txt
    的每一行读入该对象谢谢!那太好了。只是一个后续问题;-假设我想将其他相关数据保持在最大值,如果我不使用“映射”方法,var最大值会是7维数组吗?那么我是否能够按照给定列中的最大值对该数组进行排序?(可能有一个自定义的排序功能)。我的想法是在谷歌地图上绘制x第一大地震。但我需要与最大震级相关联的long和lat传递到函数中