Вопрос или проблема
В настоящее время я читаю SQL-запросы из столбца в CSV-файле, выполняю их в Snowflake и затем генерирую результат SQL-запроса в отдельном Excel-файле для каждого запроса. Код работает нормально.
Excel-файлы создаются с именами файлов как result_1.xlsx
, result_2.xlsx
. Но теперь я хочу создать Excel-файл с именем файла, указанным во втором столбце CSV-файла. Например, результат первого запроса должен быть сохранен как test1.xlsx
, результат второго запроса должен быть сохранен как test2.xlsx
. Имя файла Excel должно считываться из второго столбца CSV-файла.
Ниже представлен мой код на Python:
# Чтение запросов из CSV-файла с кодировкой UTF-8, чтобы удалить BOM
with open(csv_file_path, mode="r", encoding='utf-8-sig') as file:
reader = csv.reader(file)
queries = [row[0] for row in reader if row] # Пропустить пустые строки
# Выполнение каждого запроса и сохранение результатов в отдельные Excel-файлы
for i, query in enumerate(queries):
try:
# Выполнение запроса с использованием движка SQLAlchemy
df = pd.read_sql(query, engine)
# Определение имени выходного Excel-файла
output_file = os.path.join(output_directory, f'result_{i + 1}.xlsx')
# Сохранение DataFrame в Excel-файл
df.to_excel(output_file, index=False)
print(f'Сохранены результаты запроса {i + 1} в {output_file}')
except Exception as e:
print(f"Ошибка выполнения запроса {i + 1}: {e}")
Ответ или решение
Чтобы добиться сохранения результатов SQL-запросов в файлы Excel с именами, указанными во втором столбце CSV-файла, необходимо внести определенные изменения в существующий код. Этот код будет считывать оба столбца: первый из них будет содержать сам SQL-запрос, а второй — имя для выходного файла. В данном ответе приведен подробный пример реализации данной задачи на Python с использованием библиотеки Pandas для обработки данных и SQLAlchemy для работы с базой данных.
Шаг 1: Подготовка
Убедитесь, что у вас установлены необходимые библиотеки. Если они еще не установлены, выполните следующие команды:
pip install pandas sqlalchemy openpyxl
Шаг 2: Написание кода
Ниже приведен измененный код, который выполнит ваши требования:
import csv
import os
import pandas as pd
from sqlalchemy import create_engine
# Параметры подключения к базе данных Snowflake
connection_string = 'your_connection_string'
engine = create_engine(connection_string)
# Путь к CSV файлу и директории для сохранения Excel файлов
csv_file_path = 'queries.csv'
output_directory = 'output_directory'
# Убедитесь, что директория для выходных файлов существует
os.makedirs(output_directory, exist_ok=True)
# Чтение SQL запросов и названий файлов из CSV
with open(csv_file_path, mode="r", encoding='utf-8-sig') as file:
reader = csv.reader(file)
next(reader) # Пропускаем заголовки, если они есть
queries_and_names = [row for row in reader if row] # Считываем все непустые строки
# Выполнение каждого запроса и сохранение результатов в Excel файлы
for query, file_name in queries_and_names:
try:
# Выполняем запрос с использованием SQLAlchemy
df = pd.read_sql(query, engine)
# Определяем имя выходного Excel файла
output_file = os.path.join(output_directory, f'{file_name}.xlsx')
# Сохраняем DataFrame в Excel файл
df.to_excel(output_file, index=False)
print(f'Результаты запроса сохранены в файл: {output_file}')
except Exception as e:
print(f"Ошибка выполнения запроса: {e}")
Шаг 3: Объяснение кодирования
-
Импорт библиотек: мы импортируем необходимые модули, включая
pandas
для работы с данными иsqlalchemy
для подключения к базе данных. -
Параметры подключения: укажите строку подключения к вашей базе данных Snowflake.
-
Чтение CSV файла: мы открываем CSV-файл и считываем его содержимое. Мы пропускаем заголовки (если они присутствуют) и формируем список пар
(query, file_name)
. -
Выполнение запросов: в цикле мы выполняем каждый SQL-запрос и сохраняем результат в файл с именем из второго столбца CSV-файла. Мы обрабатываем потенциальные ошибки.
-
Сохранение результатов: результаты запроса сохраняются в формате Excel с указанием имени файла.
Заключение
С помощью вышеизложенного кода вы сможете извлекать данные из SQL-запросов и сохранять результаты в файлы Excel с заданными именами. Это значительно упростит управление выходными данными, сделает их более понятными и удобными в использовании.
Не забывайте тестировать ваш код на различных сценариях и корректировать его при необходимости. Успехов в программировании!