【问题标题】:Convert CSV webservice into multiple year Highcharts line graph将 CSV 网络服务转换为多年 Highcharts 折线图
【发布时间】:2016-11-28 08:32:41
【问题描述】:

我正在请求一个 Web 服务,它会以这样的 CSV 文件进行响应(提供过去几年的更多月度数据)。对我来说重要的是该行中的第一条和最后一条信息(又名日期和值):

2010/01/01,51.67074582499006,13.789093928493081,-0.0010074468085106377
2010/02/01,51.67074582499006,13.789093928493081,0.0024117021276595747
2010/03/01,51.67074582499006,13.789093928493081,0.026550000000000004
2010/04/01,51.67074582499006,13.789093928493081,0.08252659574468087
2010/05/01,51.67074582499006,13.789093928493081,0.12837446808510639
2010/06/01,51.67074582499006,13.789093928493081,0.140618085106383
2010/07/01,51.67074582499006,13.789093928493081,0.0668787234042553
2010/08/01,51.67074582499006,13.789093928493081,0.10335744680851064
2010/09/01,51.67074582499006,13.789093928493081,0.08095000000000001
2010/10/01,51.67074582499006,13.789093928493081,0.0400159574468085
2010/11/01,51.67074582499006,13.789093928493081,0.004214893617021277
2010/12/01,51.67074582499006,13.789093928493081,-0.0018680851063829788
2011/01/01,51.67074582499006,13.789093928493081,0.0011914893617021279
2011/02/01,51.67074582499006,13.789093928493081,0.003752127659574468
2011/03/01,51.67074582499006,13.789093928493081,0.027225531914893623

有了这些信息,我想构建一个 Highcharts 图形,它为每个单独的年份显示一条单独的线。它应该如下所示:

我当前的版本将所有数据添加到很长的一行 - 这很好,但不能使这些年份之间的值具有可比性:

function processData(allText) 
{
    var allTextLines = allText.split(/\r\n|\n/);
    var lines = []; var n = 0; var data = []; var dateValue = [];

    for (var i=1; i<allText.length; i++) 
    {
        if (allTextLines[i])
        {
            if ((allTextLines[i].substring(0,2) == "19") || (allTextLines[i].substring(0,2) == "20"))
            {
                dateValue = allTextLines[i].split(",");

                // everything will be concatenated into one single line
                if(Number.isFinite(parseFloat(dateValue[3])))
                {
                    data[n] = [new Date(dateValue[0]).getTime(), parseFloat(dateValue[3])];
                }

                n++;                                
            }
        }                   
    }

    return data;
}

现在,我需要的是如下所示的结果:

series: 
[{
    name: "2010",
    data: [-0.001007447,0.002411702,0.02655,0.082526596,0.128374468,0.140618085,0.066878723,0.103357447,0.08095,0.040015957,0.004214894,-0.001868085]
},{
    name: "2011",
    data: [0.001191489,0.003752128,0.027225532,0.090589362,0.129121277,0.141264894,0.119343617,0.113290426,0.093575532,0.044221277,0.015881915,0.004068085]
}
],
...

但我不知道我的 Javascript 代码必须是什么样子才能产生这样的结果。谁能给个提示?

【问题讨论】:

    标签: javascript csv highcharts


    【解决方案1】:

    您可以像这样提取数据:

    function extract(csv) {
        var rows = csv.split(/\r\n|\n/);
        var data;
        var series = [];
        var serie = {name: -1, data: []};
        for (var i = 0; i < rows.length; i++) {
                data = rows[i].split(',');
            if (serie.name === -1) {
                    serie.name = data[0].substr(0,4);
            }
            else if (serie.name !== data[0].substr(0,4)) {
                series.push(serie);
                serie = {name: data[0].substr(0,4), data: []};
            }
            serie.data.push(parseFloat(data[3]));
        }
        series.push(serie);
        return series;
    }
    

    jsFiddle : https://jsfiddle.net/mk7x7bbe/

    【讨论】:

    • 哇,这真的很酷。非常感谢!小问题还在我这边,我试图解决是徒劳的:我正在使用chart1 = new Highcharts.Chart(},因为我的页面上有多个图表;并且,由于使用了网络服务,我在该调用的success: function(data) 中调用了extract(csv)。我会这样做var series_return = extract(data);,然后添加它chart1.addSeries(series_return);。但这不起作用。我已经相应地更改了the fiddle,以使其更清晰。
    • 我仍然没有成功地将其转换为一个工作示例。尤其是现在,当数据组合通过success: function(data) {} 进行 Ajax 调用时。我有一个电话series_return = extract(csv);chart.addSeries(series_return);。但那是行不通的。怎么了?我已更新 the fiddle 以反映我的需求。感谢您的任何提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多