Преобразование вывода (println!) в файл .csv

use yahoo_finance::{history, Interval, Timestamped};

#[tokio::main]

async fn main() {

    let data = history::retrieve_interval("AAPL", Interval::_6mo).await.unwrap();

    for end in &data {

        println!("Close ${:.2}, {}", end.close,end.datetime().format("%b %e %y)"));
    }
}

По сути, я хочу взять эту программу и получить вывод в виде файла .csv, а не println!(), я просто использовал println! чтобы убедиться, что программа работает. Я все еще довольно новичок в Rust и программировании в целом (извините, если я кажусь необразованным). Я просто делаю эту программу как нечто практическое, что я могу использовать (работая в финансовой сфере) и опираться на нее.


person Michael Mesa    schedule 23.02.2021    source источник


Ответы (2)


Вы можете сделать именно это, используя макрос writeln! вместо println!. Вам понадобится что-то, что реализует трейт Write, например File. Это нужно передать в качестве первого аргумента writeln!.

Тогда ваш пример будет написан так:

use yahoo_finance::{history, Interval, Timestamped};

#[tokio::main]
async fn main() {
    let data = history::retrieve_interval("AAPL", Interval::_6mo).await.unwrap();

    // create a file called data.csv, overwriting the file if it already existed
    let mut file = std::fs::File::create("data.csv");

    for end in &data {
        // write to the file instead of standard output
        writeln!(file, "Close ${:.2}, {}", end.close,end.datetime().format("%b %e %y"));
    }
}

Я убрал скобки в формате даты, я думаю, это было ошибкой? В любом случае, я надеюсь, что смог помочь.

Как отмечали другие, это не самое чистое возможное решение, и вам, возможно, придется обратить внимание на то, чтобы цитировать себя и тому подобное, поэтому изучение использования библиотеки CSV также может быть хорошей идеей. Но в этом случае я думаю, что это должно работать нормально, как это.

person Johann150    schedule 23.02.2021

Существует API std::fs::File, позволяющий создавать файлы. В этих файлах есть write. функция, в которую вы можете перейти в String. Существует макрос format!, который позволяет делать то же самое, что и println!, но вместо этого возвращает String. Итак, если вы соберете все это вместе, вы сможете создать файл с именем, оканчивающимся на .csv, а затем использовать API для записи в него данных в цикле for, как вы сделали с println!.

Вероятно, более подходящим способом сделать это будет поиск csv ящика, который может предоставить вам некоторые дополнительные csv функциональные возможности. Быстрый поиск дал эту библиотеку.

person jeanluc    schedule 23.02.2021
comment
Также есть макрос writeln!, который делает то же самое, что и println!, за исключением того, что позволяет указать выходной файл вместо стандартного вывода. - person Jmb; 23.02.2021