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

#web-scraping #rust #export-to-csv #yahoo-finance #writer

#веб-очистка #Ржавчина #экспорт в csv #yahoo-финансы #писатель

Вопрос:

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

#[tokio::main]

async fn main() {

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

    for end in amp;data {

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

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

Ответ №1:

Вы можете сделать именно это, используя writeln! макрос вместо println! . Вам понадобится что-то, что реализует Write признак, например a 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 amp;data {
        // write to the file instead of standard output
        writeln!(file, "Close ${:.2}, {}", end.close,end.datetime().format("%b %e %y"));
    }
}
 

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

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

Ответ №2:

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

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

Комментарии:

1. Существует также writeln! макрос, который выполняет то же самое, println! что и, за исключением того, что он позволяет вам указывать выходной файл вместо печати в стандартный вывод.