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 ответов

73 просмотра

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

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

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

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

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

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

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

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта