Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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
Javascript 按列名筛选CSV,将具有唯一值(和最大年份字段)的行推送到数组_Javascript_Csv - Fatal编程技术网

Javascript 按列名筛选CSV,将具有唯一值(和最大年份字段)的行推送到数组

Javascript 按列名筛选CSV,将具有唯一值(和最大年份字段)的行推送到数组,javascript,csv,Javascript,Csv,我有一个csv,有4列:类型、状态、年份、值 有多个行共享相同的类型和状态。我想过滤csv,这样对于每个类型/状态组合,我只会得到一行,其中该行是最近一年的。 我想知道如何通过编程实现这一点,因为我的数据文件最终会变得越来越长。如果可能的话,我想用javascript来实现这一点 以下是我的数据: type,state,year,value oranges,florida,1990,18.17 oranges,florida,1980,14.52 oranges,flor

我有一个csv,有4列:类型、状态、年份、值

有多个行共享相同的类型和状态。我想过滤csv,这样对于每个类型/状态组合,我只会得到一行,其中该行是最近一年的。 我想知道如何通过编程实现这一点,因为我的数据文件最终会变得越来越长。如果可能的话,我想用javascript来实现这一点

以下是我的数据:

type,state,year,value
    oranges,florida,1990,18.17
    oranges,florida,1980,14.52
    oranges,florida,2000,11.1
    oranges,florida,2010,9.8
    lemons,florida,1990,8.2
    lemons,florida,1980,6.2
    lemons,florida,1985,4.1
    lemons,florida,1987,5.87
    lemons,florida,2002,5.87
    lemons,florida,2003,460
    lemons,florida,2009,730
    lemons,florida,2010,1100
    lemons,florida,2011,1200
    lemons,florida,2012,1200
    lemons,florida,2013,55.5
    lemons,florida,2014,55.1
    lemons,florida,2015,53.1
    limes,florida,1991,49.9
    limes,florida,1992,45.6
    limes,florida,1993,41.8
    limes,florida,2002,3.23
    limes,florida,2003,3.23
    limes,florida,2009,10.767
    limes,florida,2011,34.34492
    oranges,california,1964,49.9
    oranges,california,1965,0.293
    oranges,california,1970,0.293
    oranges,california,1990,16
    oranges,california,1980,16
    oranges,california,1985,29.8
    oranges,california,1987,6.3
    oranges,california,2002,6.31
    oranges,california,2003,6.27
    oranges,california,2008,6.24
    oranges,california,2009,6.38
    oranges,california,2010,10.3
    oranges,california,2011,10.3
    oranges,california,2012,10.4
    oranges,california,2013,8.5
    oranges,california,2014,12.6
    oranges,california,2015,75.1
    lemons,california,1950,74.8
    lemons,california,1955,74.5
    lemons,california,1960,74.2
    lemons,california,1965,72.9
    lemons,california,1970,72.7
    limes,california,1990,72.4
    limes,california,1991,72.1
    limes,california,1992,102.56187
    limes,california,1993,102.25079
    limes,california,1994,96.70884
    limes,california,1995,88
我希望我的结果是:

type,state,year,value
lemons,california,1970,72.7
limes,california,1995,88
oranges,california,2015,75.1
lemons,florida,2015,53.1
limes,florida,2011,34.34492
oranges,florida,2010,9.8
  • 创建空数组
  • 以循环方式逐行获取csv
  • 按逗号拆分以获得水果状态和年份
  • 如果数组中不存在水果和状态的组合,则添加到arrray
  • 否则检查年份,如果是最近的,则用新值替换数组中较旧的值
  • [编辑]您可以直接在从csv转换的数组上循环:

    • 将csv转换为数组
    代码示例:

        var items = [];
        items['florida_oranges'] = 1990;
    
        //data taken from array list
        var newYear = 1994;
        var state = 'florida';
        var fruit = 'oranges';
    
        //checking
        var index = state + "_" + fruit;
        if(items[index] && items[index] < newYear) items[index] = newYear;
    
    var项目=[];
    项目['florida_oranges']=1990;
    //从数组列表中获取的数据
    var newYear=1994年;
    var state=‘佛罗里达’;
    变量水果=‘橙子’;
    //检查
    var指数=状态+水果;
    如果(项目[索引]&项目[索引]<新年)项目[索引]=新年;
    
  • 创建空数组
  • 以循环方式逐行获取csv
  • 按逗号拆分以获得水果状态和年份
  • 如果数组中不存在水果和状态的组合,则添加到arrray
  • 否则检查年份,如果是最近的,则用新值替换数组中较旧的值
  • [编辑]您可以直接在从csv转换的数组上循环:

    • 将csv转换为数组
    代码示例:

        var items = [];
        items['florida_oranges'] = 1990;
    
        //data taken from array list
        var newYear = 1994;
        var state = 'florida';
        var fruit = 'oranges';
    
        //checking
        var index = state + "_" + fruit;
        if(items[index] && items[index] < newYear) items[index] = newYear;
    
    var项目=[];
    项目['florida_oranges']=1990;
    //从数组列表中获取的数据
    var newYear=1994年;
    var state=‘佛罗里达’;
    变量水果=‘橙子’;
    //检查
    var指数=状态+水果;
    如果(项目[索引]&项目[索引]<新年)项目[索引]=新年;
    
    下面是一个如何在nodejs中完成的示例。我一直保持这个例子小而简单

    您需要运行的内容:

    • nodejs安装有
    • 已安装快速csv模块(npm安装 快速(csv)

    • 假定输入文件(data.csv)

    • 输出文件将是(stats.csv)
    //代码片段

    var fs = require('fs');
    
    var csv = require('fast-csv');
    
    var stats = [];
    
    csv
     .fromPath("data.csv")
     .on("data", function(data){
            addOrUpdate(data);
     })
     .on("end", function(){
         console.log(stats);
         writeStats(stats);
     });
    
    function addOrUpdate(item) {
            var found = false;
            for ( var i=0; i<stats.length; i++ ) {
                    if ( stats[i][0] === item[0] && stats[i][1] === item[1] ) {
                            found = true;
                            if  (stats[i][3] < item[3]) {
                                    stats[i][2] = item[2];
                                    stats[i][3] = item[3];
                            }
                            break;
                    }
            }
            if ( false == found) {
                    stats.push(item);
            }
    }
    
    function writeStats(stats) {
      var csvStream =
        csv
         .createWriteStream({headers: false}),
            writableStream = fs.createWriteStream("stats.csv");
       csvStream.pipe(writableStream);
       for ( i=0; i<stats.length; i++ ) {
          csvStream.write(stats[i]);
       }
       csvStream.end();
    
    }
    
    var fs=require('fs');
    var csv=要求('fast-csv');
    var stats=[];
    csv
    .fromPath(“data.csv”)
    .on(“数据”),功能(数据){
    添加或更新(数据);
    })
    .on(“结束”,函数(){
    console.log(stats);
    书面状态(统计);
    });
    功能添加或更新(项目){
    var=false;
    
    对于(var i=0;i,这里是一个如何在nodejs中实现的示例。我将示例保持为小而简单

    您需要运行的内容:

    • nodejs安装有
    • 已安装快速csv模块(npm安装 快速(csv)

    • 假定输入文件(data.csv)

    • 输出文件将是(stats.csv)
    //代码片段

    var fs = require('fs');
    
    var csv = require('fast-csv');
    
    var stats = [];
    
    csv
     .fromPath("data.csv")
     .on("data", function(data){
            addOrUpdate(data);
     })
     .on("end", function(){
         console.log(stats);
         writeStats(stats);
     });
    
    function addOrUpdate(item) {
            var found = false;
            for ( var i=0; i<stats.length; i++ ) {
                    if ( stats[i][0] === item[0] && stats[i][1] === item[1] ) {
                            found = true;
                            if  (stats[i][3] < item[3]) {
                                    stats[i][2] = item[2];
                                    stats[i][3] = item[3];
                            }
                            break;
                    }
            }
            if ( false == found) {
                    stats.push(item);
            }
    }
    
    function writeStats(stats) {
      var csvStream =
        csv
         .createWriteStream({headers: false}),
            writableStream = fs.createWriteStream("stats.csv");
       csvStream.pipe(writableStream);
       for ( i=0; i<stats.length; i++ ) {
          csvStream.write(stats[i]);
       }
       csvStream.end();
    
    }
    
    var fs=require('fs');
    var csv=要求('fast-csv');
    var stats=[];
    csv
    .fromPath(“data.csv”)
    .on(“数据”),功能(数据){
    添加或更新(数据);
    })
    .on(“结束”,函数(){
    console.log(stats);
    书面状态(统计);
    });
    功能添加或更新(项目){
    var=false;
    
    对于(var i=0;i您可以使用以下PHP代码执行此操作:

    <?php
        $csvData = array_map('str_getcsv', file("input.csv")); // put csv file in an array
        $csvHeader = array_shift($csvData);    // chop off first element (header) and save in array
        $testArray = array();   // create array
    
        // iterate over rows in csvData
        for ($i = 0; $i < count($csvData); $i++) {
            // if state and type are NOT in array or, year selected row is greater than the one in array 
            if (!in_array($csvData[$i][0] . '_' . $csvData[$i][1], $testArray) || $testArray[$csvData[$i][0] . '_' . $csvData[$i][1]]['year'] > $csvData[$i][2]) {
                // build multidimensional array
                $testArray[$csvData[$i][0] . '_' . $csvData[$i][1]] = array(
                    'type' => $csvData[$i][0],
                    'state' => $csvData[$i][1],
                    'year' => $csvData[$i][2],
                    'value' => $csvData[$i][3],
                );
    
            }
    
        }
    
        array_unshift($testArray, $csvHeader);  // put header back
        $fp = fopen('output.csv', 'w'); // open file
    
        // fill csv file
        foreach($testArray as $fields) {
            fputcsv($fp, $fields);
        }
    
        fclose($fp);    // close file
    ?>
    

    您可以使用以下PHP代码执行此操作:

    <?php
        $csvData = array_map('str_getcsv', file("input.csv")); // put csv file in an array
        $csvHeader = array_shift($csvData);    // chop off first element (header) and save in array
        $testArray = array();   // create array
    
        // iterate over rows in csvData
        for ($i = 0; $i < count($csvData); $i++) {
            // if state and type are NOT in array or, year selected row is greater than the one in array 
            if (!in_array($csvData[$i][0] . '_' . $csvData[$i][1], $testArray) || $testArray[$csvData[$i][0] . '_' . $csvData[$i][1]]['year'] > $csvData[$i][2]) {
                // build multidimensional array
                $testArray[$csvData[$i][0] . '_' . $csvData[$i][1]] = array(
                    'type' => $csvData[$i][0],
                    'state' => $csvData[$i][1],
                    'year' => $csvData[$i][2],
                    'value' => $csvData[$i][3],
                );
    
            }
    
        }
    
        array_unshift($testArray, $csvHeader);  // put header back
        $fp = fopen('output.csv', 'w'); // open file
    
        // fill csv file
        foreach($testArray as $fields) {
            fputcsv($fp, $fields);
        }
    
        fclose($fp);    // close file
    ?>
    
    
    
    如何检查水果和状态是否不存在?能否提供一个代码示例?我不确定如何执行此操作。如何检查水果和状态是否不存在?能否提供一个代码示例?我不确定如何执行此操作。