Доброе утро. При помощи нейросети писал код, который читает базу

данных в формате .sql и экспортирует в csv файл

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() -> std::io::Result<()> {
// Открытие SQL-дампа и CSV-файла
let sql_file = File::open("db.sql")?;
let sql_reader = BufReader::new(sql_file);

let mut csv_file = File::create("output.csv")?;
let mut csv_writer = csv::Writer::from_writer(&mut csv_file);

// Чтение SQL-дампа и запись данных в CSV-файл
for line in sql_reader.lines() {
let line = line.unwrap();

// Пропускаем строки комментариев и пустые строки
if line.starts_with("--") || line.starts_with("/*") || line.trim().is_empty() {
continue;
}

// Определяем тип SQL-команды
if line.starts_with("CREATE TABLE") {
// Игнорируем команду CREATE TABLE
continue;
} else if line.starts_with("INSERT INTO") {
// Извлекаем данные из команды INSERT INTO
let values_start = line.find("VALUES (").unwrap() + "VALUES (".len();
let values_end = line.rfind(")").unwrap();
let values = &line[values_start..values_end];

// Запись данных в CSV-файл
let values = values.replace("),(", "\n").replace("(", "").replace(")", "");
for row in values.split('\n') {
let fields: Vec<&str> = row.split(',').collect();
csv_writer.write_record(fields)?;
}
}
}

csv_writer.flush()?;

println!("Данные успешно экспортированы в CSV-файл.");

Ok(())
}

Но проблема - читает файл размером 6 гигов, а csv файл получается размером 5 мбайт. Т.е. явно не все строки. Подскажите, что не так?

2 ответов

2 просмотра

1) Подсунь ей короткий SQL-файл и посмотри в отладке, 2) напиши тесты

krakotay- Автор вопроса
Денис Артемов
1) Подсунь ей короткий SQL-файл и посмотри в отлад...

Всё, проблема уже решена. Вот правильный код use std::fs::File; use std::io::{self, BufRead, BufReader, Write}; fn main() -> io::Result<()> { // Открытие файла db.sql let file = File::open("db.sql")?; let reader = BufReader::new(file); // Создание CSV-файла для экспорта let mut csv_file = File::create("export.csv")?; // Флаг для определения начала данных таблицы let mut found_table = false; // Чтение файла построчно for line in reader.lines() { let line = line?; // Поиск начала данных таблицы if found_table && line.starts_with("INSERT INTO") { let values = line.trim_start_matches("INSERT INTO") .trim_end_matches(";"); // Разделение значений по запятой let values: Vec<&str> = values.split(",").collect(); // Запись значений в CSV-файл writeln!(csv_file, "{}", values.join(","))?; } // Поиск начала данных таблицы if !found_table && line.starts_with("INSERT INTO") { found_table = true; } } Ok(()) }

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

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

а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
‌/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
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
Ребята, я за проф советом😅 По микросервисам. В монолите есть общие файлы для сервисов: фетчи, конфиги, либы, утилсы.. как при распиле правильно их поддерживать? Пока вариант д...
Александр Тарасюк
1
Карта сайта