Use pyo3::{wrap_pyfunction, prelude::*}; use calamine::{open_workbook_auto, DataType, Range, Reader}; use std::fs::File; use std::io::{BufWriter, Write}; use

std::path::PathBuf;
/// Formats the sum of two numbers as string.
/// A Python module implemented in Rust.
#[pymodule]
fn xlsx2csv(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(make_csv, m)?)?;
Ok(())
}
#[pyfunction]
fn make_csv(py: Python, file: String, separator: Option<String>)-> PyResult<&PyAny> {
println!("Создаём файлы");
//Первый файл
let sce = PathBuf::from(&file);
match sce.extension().and_then(|s: &std::ffi::OsStr| s.to_str()) {
Some("xlsx") | Some("xlsm") | Some("xlsb") | Some("xls") => (),
_ => panic!("Expecting an excel file"),
}

let dest: PathBuf = sce.with_extension("csv");
let mut dest = BufWriter::new(File::create(dest).unwrap());
let mut xl = open_workbook_auto(&file).unwrap();
let range = xl.worksheet_range_at(0).unwrap().unwrap();
let sep = separator.unwrap_or(','.to_string());
let locals = pyo3_asyncio::TaskLocals::with_running_loop(py)?.copy_context(py)?;
return pyo3_asyncio::tokio::future_into_py_with_locals(py, locals.clone(), write_range(&mut dest, range.clone(), sep));
}

async fn write_range<W: Write>(dest: &mut W, range: Range<DataType>, separator: String) -> Result<(), PyErr> {
let n = range.get_size().1 - 1;
for r in range.rows() {
for (i, c) in r.iter().enumerate() {
match *c {
DataType::Empty => Ok(()),
DataType::String(ref s) | DataType::DateTimeIso(ref s) | DataType::DurationIso(ref s) => {
write!(dest, "{}", s)
}
DataType::DateTime(ref s) | DataType::Duration(ref s) => {write!(dest, "{}", s.to_string())}
DataType::Float(ref f) => {
write!(dest, "{}", f)
}

DataType::Int(ref i) => write!(dest, "{}", i),
DataType::Error(ref e) => write!(dest, "{:?}", e),
DataType::Bool(ref b) => write!(dest, "{}", b),
}?;
if i != n {
write!(dest, "{}", separator)?;
}
}
write!(dest, "\r\n")?;
}
Ok(())
}

Вот код

6 ответов

22 просмотра

Стикер

Стикер

Видимо, медленно работала синхронная https://t.me/rust_beginners_ru/251672

Twin Terrors
Видимо, медленно работала синхронная https://t.me/...

какое-то сильное непонимание асинка как будто

krakotay- Автор вопроса

Всё просто - скорость :)

krakotay- Автор вопроса
Алиса Королёва
какое-то сильное непонимание асинка как будто

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

Похожие вопросы

Обсуждают сегодня

Ребята, я за проф советом😅 По микросервисам. В монолите есть общие файлы для сервисов: фетчи, конфиги, либы, утилсы.. как при распиле правильно их поддерживать? Пока вариант д...
Александр Тарасюк
1
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
‌/r/pathofexile moderation changes top scoring links : pathofexile (RSS) Hi, everyone. On behalf of the subreddit mod team, I’m here to give you a few updates on the subreddi...
Esionru
3
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
Ребят, есть какие нибудь мили билды, способные в шмотках с пола закрывать атлас?
Ninja Obormot
12
Карта сайта