Найти минимальное и максимальное значение в файле csv

Пытаясь расширить свой объект javascript, я хочу найти минимум и максимум многоколоночного CSV-файла. Я искал решения, но я не могу понять правильный путь. Я нашел решение здесь: Минимум и максимум в многомерном массиве, но я не получить вывод. Мой код, который у меня есть на данный момент, находится здесь:

function import(filename)
{
var f = new File(filename);
var csv = [];
var x = 0;
if (f.open) {
    var str = f.readline(); //Skips first line.
    while (f.position < f.eof) {
        var str = f.readline(); 
        csv.push(str);
    }
    f.close();
} else {
    error("couldn't find the file ("+ filename +")\n");
}


for (var i=(csv.length-1); i>=0; i--) {

        var str = csv.join("\n");

        var a = csv[i].split(","); // convert strings to array (elements are     delimited by a coma)
        var date = Date.parse(a[0]);

        var newdate = parseFloat(date);
        var open = parseFloat(a[1]);
        var high = parseFloat(a[2]);
        var low = parseFloat(a[3]);
        var close = parseFloat(a[4]);
        var volume = parseFloat(a[5]);

        var volume1000 = volume /= 1000;
        var adjusted_close = parseFloat(a[6]);

    outlet(0, x++, newdate,open,high,low,close,volume1000,adjusted_close); //    store in the coll  
}
}

person Samuel Van Ransbeeck    schedule 13.03.2014    source источник


Ответы (1)


Изменить Что если вместо массива массивов использовать массив объектов? Предполагается, что вы используете подчеркивание.

var outlet=[];
var outletkeys=['newdate','open','high','low','close','volume','volume1000','adjusted_close'];
for (var i=(csv.length-1);i>0; i--) {
    var a = csv[i].split(","); 
    var date = Date.parse(a[0]);
    var volume = parseFloat(a[5],10);

outlet.push( _.object(outletkeys, [parseFloat(date,10) ,        parseFloat(a[1],10) ,        parseFloat(a[2],10) ,        parseFloat(a[3],10) ,        parseFloat(a[4],10) ,        parseFloat(a[5],10) ,        volume /= 1000 ,        parseFloat(a[6],10) ]) );
}

Тогда массив открытого столбца будет

_.pluck(outlet,'open');

И минимум это

_.min(_.pluck(outlet,'open'));

Изменить2

Давайте пока забудем о подчеркивании. Я считаю, что вам нужно получить максимальное значение во втором столбце, которое вы указали в своей переменной open.

¿Было бы полезно, если бы вы могли иметь это значение сразу после цикла for? Например

var maxopen=0;
for (var i=(csv.length-1); i>=0; i--) {
    var a = csv[i].split(","); 
    var date = Date.parse(a[0]);
    var newdate = parseFloat(date);
    var open = parseFloat(a[1]);
    maxopen=(open>maxopen)? open : maxopen; // open overwrites the max if it greater
    ...
    ...
    outlet(0, x++, newdate,open,high,low,close,volume1000,adjusted_close);
}
console.log('Maximum of open is',maxopen);
person ffflabs    schedule 13.03.2014
comment
Я использую цикл for, чтобы вывести содержимое массива в обратном порядке. Я начинаю с многоколоночного CSV-файла, в котором я удаляю первую строку (заголовок), а затем считываю данные в обратном порядке. Затем данные выходят через выход 0. Мне нужен максимум столбца 2 (и я полагаю, что тогда я могу изменить функцию для поиска минимума). - person Samuel Van Ransbeeck; 13.03.2014
comment
Я отредактировал свой ответ, чтобы использовать методы подчеркивания pluck, object и min. Попробуйте! - person ffflabs; 14.03.2014
comment
Мне нужно было закончить еще один проект, поэтому этот остался незамеченным. Я возвращаюсь к этому, но я не могу понять, как вы это делаете. Где я должен поместить ваш код в свой код? Кроме того, что означает число 10, откуда вы взяли это число? Что означает output.push? Я использую выход как выход коробки, содержащей код в maxMSP. - person Samuel Van Ransbeeck; 30.04.2014
comment
Добавление к моему комментарию: поскольку я использую JS в MaxMSp, я не могу использовать библиотеку подчеркивания. Не могли бы вы опубликовать свой предыдущий ответ, чтобы я мог попробовать это? - person Samuel Van Ransbeeck; 01.05.2014
comment
10 - параметр системы счисления. Для правильного использования parseFloat требуется основание счисления, но по умолчанию оно равно 10. Я никогда не слышал о MaxMSp, но звучит так, как будто у него есть внутренний механизм синтаксического анализа js. Вы уверены, что его нельзя расширить с помощью модулей? Даже веб-воркеры могут импортировать сторонние библиотеки. - person ffflabs; 01.05.2014
comment
Итак, что мне нужно скачать, чтобы установить underscore.js? На странице Github я скачал jsfile, но что мне с ним делать? Я попытаюсь получить его в своей системе, но тогда вопрос в том, что произойдет, если кто-то еще захочет использовать мое приложение? - person Samuel Van Ransbeeck; 01.05.2014
comment
Вот ссылка на приложение, которое я делаю (только соответствующая часть). Вы помещаете csvfile в droprectangle, и объект js читает его. Я включил короткий CSV-файл, чтобы вы могли сразу его протестировать: dropbox.com/sh/ a09818a7fnhys56/ft-vP6R6Ot Только для Mac - person Samuel Van Ransbeeck; 01.05.2014
comment
Мне жаль, что я выбрал чрезмерный подход. Возможно, то, что вам нужно, намного проще, и я не стал начинать с самого простого сценария. ¿Можете ли вы увидеть мой абзац Edit2? - person ffflabs; 01.05.2014
comment
Кажется, это работает. Я расширю его для использования с другими переменными, а затем опубликую полный код. Благодарю вас! - person Samuel Van Ransbeeck; 01.05.2014
comment
Извините, что беспокою еще раз: как мне получить минимум каждого столбца? Я не могу объявить начальное значение равным 0, потому что конечным результатом всегда будет 0. Этот оператор не работает: minopen=(open‹minopen)? открытый: минооткрытый; Итак, начальное значение должно быть ненулевым, но как мне с этим справиться? - person Samuel Van Ransbeeck; 05.05.2014
comment
Можно объявить var minopen=-Infinity;, чтобы все было больше, чем его начальное значение. - person ffflabs; 05.05.2014
comment
Я пытаюсь построить аналогичное утверждение, чтобы получить максимальные значения, но это не работает. Я объявил var minopen=-Infinity; перед циклом и внутри цикла я пытаюсь использовать такие операторы, как: minopen=(open›minopen&&open‹maxopen)? минопен : открытый; Но это дает мне последнее значение в столбце. В результате другие операторы дают мне -inf. - person Samuel Van Ransbeeck; 05.05.2014
comment
Понятно: мне пришлось сделать отдельный цикл и использовать var minopen=Infinity; как переменную, то внутри цикла читать массив и там поставить minopen=(open‹minopen)? открытый: минооткрытый; - person Samuel Van Ransbeeck; 06.05.2014