【问题标题】:How to parse data stored in an array如何解析存储在数组中的数据
【发布时间】:2019-01-16 23:31:42
【问题描述】:

我正在使用一个 CSV 文件。我不想将其转换为具有键和值的对象。我希望能够创建更多数组来存储不同的值 即温度 哼 小时 雪深等 所有这些都是具有 7 个值的数组

现在,这就是 csv 在数据数组中的存储方式

  1. "11/28/2018 7:30,1128,-2.122,86.2,34.06,1.178,320.2,20.4" ​
  2. "11/28/2018 7:45,1129,-2.325,85.6,34.54,1.771,325.5,30.72" ​
  3. "11/28/2018 8:00,1130,-2.679,85.7,30.73,1.764,312.1,28.98" ​
  4. "11/28/2018 8:15,1131,-2.872,88,34.55,1.073,306.6,25.65" ​
  5. "11/28/2018 8:30,1132,-2.953,90.7,35.25,1.247,311.2,30.06" ​
  6. "11/28/2018 8:45,1133,-3.064,93.3,35,1.449,312.6,30.13" ​
  7. "11/28/2018 9:00,1134,-2.771,91.5,33.44,0.988,311,28.27" ​​​ 长度:7

第 1 列是时间戳,第 2 列是记录编号,第 3 列是温度,第 4 列是湿度等等。

function get_Data(data) {
    "use strict";
    var fileData = new Array();
    data = data.split(/\r\n|\r|\n/);
    data = data.slice(Math.max(data.length - 7, 0));
    createGraph(data);
} 

我想要这样的数组

Tem = [-2.122, -2.325, -2.679, -2.872 ...]

小时 = [7:30, 7:45, 8:00, 8:15 ...]

【问题讨论】:

  • 你真的不需要解析任何东西。你只需要用逗号分隔。要创建列 i 的值的数组:values = arr.map(str => str.split(',')[i])。很多相关问题:stackoverflow.com/search?q=%5Bjavascript%5D+parse+csv
  • 你能添加每个值吗?我们有前四个,但每行有八个值。
  • 是的,5th 是 SnowDepth,6th 是 WS_ms_S_WVT(speed) 7th 是 WindDir_D1_WVT,8th 是 SD

标签: javascript arrays string object


【解决方案1】:

简单 - mapsplit 每个逗号,然后查看它应该是哪个项目的索引:

var data = ["11/28/2018 7:30,1128,-2.122,86.2,34.06,1.178,320.2,20.4",
  "11/28/2018 7:45,1129,-2.325,85.6,34.54,1.771,325.5,30.72",
  "11/28/2018 8:00,1130,-2.679,85.7,30.73,1.764,312.1,28.98",
  "11/28/2018 8:15,1131,-2.872,88,34.55,1.073,306.6,25.65",
  "11/28/2018 8:30,1132,-2.953,90.7,35.25,1.247,311.2,30.06",
  "11/28/2018 8:45,1133,-3.064,93.3,35,1.449,312.6,30.13",
  "11/28/2018 9:00,1134,-2.771,91.5,33.44,0.988,311,28.27",
];

var items = {
  date: [],
  recordNumber: [],
  temperature: [],
  humidity: [],
  value5: [],
  value6: [],
  value7: [],
  value8: [],
};

Object.keys(items).forEach((key, index) => items[key].push(data.map(str => str.split(",")[index])));

console.log(items);

【讨论】:

    【解决方案2】:

    你混淆了一些东西。 fileData 在做什么(似乎未使用)?而slice 不是正确的做法。

    请尝试:

    function get_Data(csv) {
        csv = csv.replace(/[\r\n]+/gi,"\n"); // reduce line endings into single LF chars
        rows = csv.split("\n"); // split into array of rows
        var result = [];
        for (var i in rows) result.push(rows[i].split(",")); // split each row
        return result;
    }
    

    (编辑)如果您只需要 CSV 数据的最后 X 行,请使用:

    function get_Data(csv,lastNumRows) { // get only the last <lastNumRows> rows
        csv = csv.replace(/[\r\n]+/gi,"\n"); // reduce line endings into single LF chars
        rows = csv.split("\n").slice(-lastNumRows); // split into array of rows
        var result = [];
        for (var i in rows) result.push(rows[i].split(",")); // split each row
        return result;
    }
    

    【讨论】:

    • 没错,我不需要fileData。我想要文件的最后 7 行
    • 对,现在我知道你是如何使用slice的了。我编辑了我的答案,只得到最后 7 行。
    • 哦,但我也看到我误读了您的原始问题,您实际上需要列(例如所有温度或所有湿度),而不是行。我的错。
    【解决方案3】:

    试试这个,它应该可以工作。我知道数据的位置,因此很容易拆分并找到术语和日期

    var csv = document.getElementById("csvFile").innerHTML ;
    
    
    
    function get_Data(data) {
        var result = {terms:[], hours:[] }
        var r = data.split(/\r\n|\r|\n/);
    
        r.forEach(function(element) {
        if (element !== "" && element.length>1){
          var term = element.split(",")[2]
          var date = new Date(element.split(",")[0])
          var hour =  date.getHours() + ":" + (date.getMinutes()<=9 ? "0" + date.getMinutes() : date.getMinutes());
          
          result.terms.push(term);
          result.hours.push(hour)
          }
        });
     return result;
    } 
    
    console.log( get_Data(csv))
    <div id="csvFile" style="display:none;">
    11/28/2018 7:30,1128,-2.122,86.2,34.06,1.178,320.2,20.4
    11/28/2018 7:45,1129,-2.325,85.6,34.54,1.771,325.5,30.72
    11/28/2018 8:00,1130,-2.679,85.7,30.73,1.764,312.1,28.98
    11/28/2018 8:15,1131,-2.872,88,34.55,1.073,306.6,25.65
    11/28/2018 8:30,1132,-2.953,90.7,35.25,1.247,311.2,30.06
    11/28/2018 8:45,1133,-3.064,93.3,35,1.449,312.6,30.13
    11/28/2018 9:00,1134,-2.771,91.5,33.44,0.988,311,28.27
    </div>

    【讨论】:

    • 我不想做位置,因为每次有新行时记录都会变化。这将影响存储在数组中的值。我不知道这是否有意义
    • 嗯,但@Jack Bashford 做了同样的事情。我的解决方案是这样的,因为你可以控制你的数据解析。就像一小时一样。但是你呢
    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多