0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LTspiceのlogファイルをExcelファイルに変換する (Python)

Posted at

LTspiceでパラメータを変化させて.measで値を取得したときに、logファイルでは扱いにくかったので、Excelに変換するpythonプログラムを作りました。

注意点としては、LTspice側でパラメータを変化させるときは小さい順に変化させる必要があります。
LTSpiceLogReaderで変数を読み取るときになぜか順番通りにならないことがあるので、プログラムの中でソートしています。
まずは1変数のとき。

log_to_excel_1para.py
from PyLTSpice import LTSpiceLogReader
import openpyxl as xl
from openpyxl.styles import Border, Side
import tkinter as tk
from tkinter import filedialog, messagebox

#########################################################
#注意
#LTspiceでパラメータを変化させるときは小さい順に変化させること
#例:.step param C list 0.1u 0.5u 1u
#########################################################


############################################################################################
#GUI
############################################################################################
#logファイル選択GUI
def browse_log_file():
    filename = filedialog.askopenfilename(
        title="logファイルを選択",
        filetypes=[("log file", "*.log"), ("All files", "*.*")]
    )
    log_path_var.set(filename)


#エラー対策
def save_to_excel():
    log_path = log_path_var.get()
    excel_name = excel_name_var.get()
    if not log_path or not excel_name:
        messagebox.showwarning("error", "logファイルとExcel名を入力してください。")
        return
    root.destroy()


#GUIセットアップ
root = tk.Tk()
root.title("log_to_excel_1para")

log_path_var = tk.StringVar()
excel_name_var = tk.StringVar()


#logファイル選択
tk.Label(root, text="logファイル:").grid(row=0, column=0, sticky="e")
tk.Entry(root, textvariable=log_path_var, width=40).grid(row=0, column=1)
tk.Button(root, text="参照", command=browse_log_file).grid(row=0, column=2)


#Excelファイル名
tk.Label(root, text="保存名(.xlsx):").grid(row=1, column=0, sticky="e")
tk.Entry(root, textvariable=excel_name_var, width=40).grid(row=1, column=1)


#実行ボタン
tk.Button(root, text="Run", command=save_to_excel).grid(row=2, column=1, pady=10)

root.mainloop()


#######################################################################################################################
#データ変換
#######################################################################################################################
#ラベルを抽出する関数(_toなどの補助ラベルを除外)
def filtered_labels(log):
    meas_name = log.get_measure_names()
    
    return [name for name in meas_name if not (name.endswith("_from") or name.endswith("_to") or name.endswith("_at"))]


#初期リストを生成する関数
def ini_datas(log, var):
    datas = [[0] * 2 for i in range(len(set(log[var])) + 1)]
    datas[0][0] = var

    for i in range(len(set(log[var]))):
        datas[i + 1][0] = sorted(set(log[var]))[i]
    
    return datas


#罫線を引く関数
def lines():
    thin = Side(style="thick", color="B22222")

    for cell in ws[1]:  # ws[1] は1行目のセル一覧
        if cell.value is not None:
            cell.border = Border(bottom=thin)

    for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
        cell = row[0]  # 1列目のセル
        if cell.value is not None:
            cell.border = Border(right=thin)
    
    cell = ws.cell(row=1, column=1)
    cell.border = Border(bottom=thin, right=thin)


#logファイルの読み込み
log = LTSpiceLogReader(log_path_var.get())


#変数を取得
var = log.get_step_vars()[0]


#Excelファイルを生成
wb = xl.Workbook()
ws = wb.active


#各結果について2次元リストを作成、保存
for label in filtered_labels(log):
    datas = ini_datas(log, var)
    vert = len(set(log[var]))

    #リストに格納
    for i in range(vert):
        datas[i + 1][1] = log[label][i]
    
    #Excelに入力
    ws.title = label
    for row in datas:
        ws.append(row)
    ws.cell(1, 2, label)
    lines()

    ws = wb.create_sheet()

wb.remove(wb["Sheet"])
wb.save(excel_name_var.get() + ".xlsx")

次に2変数のとき。

log_to_excel_2para.py
from PyLTSpice import LTSpiceLogReader
import openpyxl as xl
from openpyxl.styles import Border, Side
import tkinter as tk
from tkinter import filedialog, messagebox

#########################################################
#注意
#LTspiceでパラメータを変化させるときは小さい順に変化させること
#例:.step param C list 0.1u 0.5u 1u
#########################################################


############################################################################################
#GUI
############################################################################################
#logファイル選択GUI
def browse_log_file():
    filename = filedialog.askopenfilename(
        title="logファイルを選択",
        filetypes=[("log file", "*.log"), ("All files", "*.*")]
    )
    log_path_var.set(filename)


#エラー対策
def save_to_excel():
    log_path = log_path_var.get()
    excel_name = excel_name_var.get()
    if not log_path or not excel_name:
        messagebox.showwarning("error", "logファイルとExcel名を入力してください。")
        return
    root.destroy()


#GUIセットアップ
root = tk.Tk()
root.title("log_to_excel_2para")

log_path_var = tk.StringVar()
excel_name_var = tk.StringVar()


#logファイル選択
tk.Label(root, text="logファイル:").grid(row=0, column=0, sticky="e")
tk.Entry(root, textvariable=log_path_var, width=40).grid(row=0, column=1)
tk.Button(root, text="参照", command=browse_log_file).grid(row=0, column=2)


#Excelファイル名
tk.Label(root, text="保存名(.xlsx):").grid(row=1, column=0, sticky="e")
tk.Entry(root, textvariable=excel_name_var, width=40).grid(row=1, column=1)


#実行ボタン
tk.Button(root, text="Run", command=save_to_excel).grid(row=2, column=1, pady=10)

root.mainloop()


#######################################################################################################################
#データ変換
#######################################################################################################################
#ラベルを抽出する関数(_toなどの補助ラベルを除外)
def filtered_labels(log):
    meas_name = log.get_measure_names()
    
    return [name for name in meas_name if not (name.endswith("_from") or name.endswith("_to") or name.endswith("_at"))]


#初期リストを生成する関数
#縦:第一変数 横:第二変数
def ini_datas(log, var1, var2):
    datas = [[0] * (len(set(log[var2])) + 1) for i in range(len(set(log[var1])) + 1)]
    datas[0][0] = var1 + "" + var2 + ""

    for i in range(len(set(log[var1]))):
        datas[i + 1][0] = sorted(set(log[var1]))[i]
    
    for i in range(len(set(log[var2]))):
        datas[0][i + 1] = sorted(set(log[var2]))[i]

    return datas


#罫線を引く関数
def lines():
    thin = Side(style="thick", color="B22222")

    for cell in ws[1]:  # ws[1] は1行目のセル一覧
        if cell.value is not None:
            cell.border = Border(bottom=thin)

    for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
        cell = row[0]  # 1列目のセル
        if cell.value is not None:
            cell.border = Border(right=thin)
    
    cell = ws.cell(row=1, column=1)
    cell.border = Border(bottom=thin, right=thin)


#logファイルの読み込み
log = LTSpiceLogReader(log_path_var.get())


#変数を取得
var1 = log.get_step_vars()[0]
var2 = log.get_step_vars()[1]


#Excelファイルを生成
wb = xl.Workbook()
ws = wb.active


#各結果について2次元リストを作成、保存
for label in filtered_labels(log):
    datas = ini_datas(log, var1, var2)
    vert = len(set(log[var1]))
    hori = len(set(log[var2]))

    #リストに格納
    for i in range(hori):
        for j in range(vert):
            datas[j + 1][i + 1] = log[label][vert * i + j]
    
    #Excelに入力
    ws.title = label
    for row in datas:
        ws.append(row)
    lines()

    ws = wb.create_sheet()

wb.remove(wb["Sheet"])
wb.save(excel_name_var.get() + ".xlsx")

補助ラベルはもしかしたら他にもあるかもしれないので、おかしくなったら除外するものに追加してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?