Heavy calculations almost done. Added script for automatization "fill_table_from_nb.py"

This commit is contained in:
Artyom Titov 2026-07-29 17:48:33 +03:00
commit 3585c75b2a
39 changed files with 125384 additions and 88606 deletions

View file

@ -0,0 +1,117 @@
#!/usr/bin/env python
import re
import subprocess
import sys
def get_clipboard_text() -> str:
"""Читает грязный текст напрямую из буфера обмена ОС через xclip."""
try:
process = subprocess.Popen(
["xclip", "-selection", "clipboard", "-o"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, _ = process.communicate()
return stdout.decode("utf-8", errors="ignore")
except FileNotFoundError:
print(
"\n[КРИТИЧЕСКАЯ ОШИБКА] Утилита 'xclip' не найдена в системе!"
)
sys.exit(1)
def clean_wolfram_text_to_row(wolfram_text: str) -> str:
"""Находит все строки таблицы без привязки к переносам строк и собирает значения Y."""
y_values = []
# Регулярное выражение находит структуры вида {"X", Y_блок} сквозь любые переносы строк (\n)
# Оно сопоставляет начало строки таблицы `{"X"` и забирает весь блок до закрывающей скобки перед запятой или концом списка
pattern = r'\{"(\d+)"\s*,\s*(.*?)\}(?:,|\s*\n*\s*\})'
matches = re.findall(pattern, wolfram_text, re.DOTALL)
for x_val, y_block in matches:
# Вытаскиваем все элементы в кавычках внутри блока Y (это решает проблему RowBox)
quoted_elements = re.findall(r'"([^"]+)"', y_block)
if quoted_elements:
# Склеиваем все части (например, ['-', '2.7105...'])
y_val = "".join(quoted_elements)
else:
# Если кавычек внутри блока нет (чистое число без RowBox и маркеров точности)
y_val = y_block.strip()
# Очищаем маркеры Wolfram
y_val = y_val.replace("`", "")
y_val = y_val.replace("*^-", "e-").replace("*^", "e")
# Проверяем на экстремально маленькие числа (машинный ноль)
try:
num_check = float(y_val)
if abs(num_check) < 1e-10:
y_val = "0"
except ValueError:
pass
y_values.append(y_val)
# Объединяем через табуляцию для вставки одной строкой в Google Sheets
return "\t".join(y_values)
def copy_to_clipboard(text: str):
"""Помещает очищенный текст обратно в буфер обмена через xclip."""
process = subprocess.Popen(
["xclip", "-selection", "clipboard"],
stdin=subprocess.PIPE,
close_fds=True,
)
process.communicate(input=text.encode("utf-8"))
def main():
print("=" * 60)
print(" ИСПРАВЛЕННЫЙ СКРИПТ (ПАРСИНГ ПЕРЕНОСОВ СТРОК И ROWBOX)")
print("=" * 60)
print("Инструкция:")
print("1. Выделите таблицу в Wolfram Mathematica и нажмите Ctrl+C.")
print("2. Переключитесь сюда и просто нажмите ENTER.")
print("3. Скрипт сам заберет данные, очистит их и обновит буфер.")
print("4. Откройте Google Sheets и нажмите Ctrl+V.\n")
print("Для выхода из скрипта нажмите Ctrl+C.\n")
while True:
try:
input("Нажмите [ENTER] для обработки буфера обмена...")
raw_input = get_clipboard_text()
if not raw_input.strip():
print("[ОШИБКА] Буфер обмена пуст!\n")
continue
cleaned_result = clean_wolfram_text_to_row(raw_input)
if cleaned_result:
copy_to_clipboard(cleaned_result)
print(
"[УСПЕХ] Буфер обмена обновлен! Все элементы на месте."
)
print("Превью строки для Google Sheets (первые 4 элемента):")
# Показываем первые 4 элемента для наглядности зануления
preview_parts = cleaned_result.split("\t")[:4]
print(" | ".join(preview_parts) + " ...\n")
else:
print(
"[ОШИБКА] В буфере обмена нет таблицы Wolfram. Попробуйте скопировать заново.\n"
)
except KeyboardInterrupt:
print("\n\nСкрипт успешно остановлен. До свидания!")
sys.exit(0)
if __name__ == "__main__":
main()