![見出し画像](https://assets.st-note.com/production/uploads/images/103221105/rectangle_large_type_2_7ef31289287639ffa6788aeb8b43f225.png?width=1200)
chatGPTを使ってカグメイクを作る-vol3
ノンプログラマーでもここまで出来るよ!という所を綴っていきます。
これまでの所、エクセルシートから四角形を作図する位置を読み込むプログラムを作りました。
作っている中で色々なやりたい事や、日常業務が出てきてなかなか進まないですね。当然っちゃ当然です。
今日の課題
エクセルのカグメイクから数値のみのファイルを作る(CSV)
CSVから板の情報を画像で表示する
この二つにチャレンジします。vol3では1つめの課題をやります。
エクセルのカグメイクから数値のみのファイルを作る(CSV)
エクセルには、家具の数値が出ています。
ただ、色んな所に飛び散っているので、それを一か所にまとめなければなりません。それをchatGPTと奮闘しました。
素人なりの奮闘を見て下さい。。。いつか、このデータを取得する必要すらなくなる予定ですが。。。
CSVを試しに作る
CSVファイルに7列のshapeデータを出したいです。 シート名"1"の、182,190,191,192,194,193,195列目にそれぞれ、name,w1,d1,h1,w2,d2,h2が入ってます。 そのデータの180行目までで、190,191,192,194,193,195にデータが全て入っている場合(空白やエラーではない)だけ出したいです
壁面収納なので、箱を1から15個まで組み合わせるようにしています。それぞれのシートの右の端っこにエクセルで作った、name,w,d,h,w,d,hのデータをCSVファイルにします。
pandasを使ってExcelファイルからデータを読み込み、条件に基づいてフィルタリングしてCSVファイルに出力することができます。以下のコードを参考にしてください。
pythonCopy codeimport pandas as pd
def read_and_filter_data(file_name, sheet_name="1", columns=None, nrows=180):
if columns is None:
columns = [182, 190, 191, 192, 194, 193, 195]
df = pd.read_excel(file_name, sheet_name=sheet_name, usecols=columns, nrows=nrows)
# Filter rows with non-empty values in columns 190, 191, 192, 194, 193, and 195
filtered_df = df[df[[190, 191, 192, 194, 193, 195]].notnull().all(axis=1)]
return filtered_df
def save_data_to_csv(data, output_file):
data.to_csv(output_file, index=False)
if __name__ == "__main__":
output_csv = r"Desktop\output.csv"
data = read_and_filter_data(file_name)
save_data_to_csv(data, output_csv)
早い!すぐできた。
でもエラー
Exception has occurred: KeyError "None of [Index([190, 191, 192, 194, 193, 195], dtype='int32')] are in the [columns]"
エラー出ました。インデックスじゃなくて名前で取得せなあかんみたいですね~。詳しくなくてすまん。
すみません、私が間違えました。列インデックスではなく、列名で条件を指定する必要があります。以下のコードをお試しください。~以下コード
wとdの順番間違ってる・・・
ややこしくてすみません、w2とd2逆なんです
問題ありません。w2 と d2 の列が逆であることを考慮して、以下のコードを修正しました。~以下、コード続く
ファイルをループさせたい!
家具のファイルをそれぞれ、1.csv,2.csvってループさせて、それぞれに同じ処理をさせたいです。
outputファイルを、sheet_name.csvに出来ますか?今回でいえば、1.csv
もちろん可能です。sheet_name変数を使用して出力ファイル名を動的に生成することができます。以下のコードを参考にしてください。
出来た!!!!
![](https://assets.st-note.com/img/1681695202760-gyBGJlziTK.png)
出来ました。既にデータになってる・・・こいつを昨日作った画像作成に読み込んだらもう板が出来上がってしまうぞ!
シートのループするための壁面家具の数を取得してループしたいぞ
sheet_numが「入力」シートのcells(8,2)に入っています。 sheet_nameを、"1"からcells(8,2)までの範囲でループして、 1.csv,2.csv....と作りたいです。いけますか?
はい、それが可能です。以下のコードは、指定されたシート(入力シート)からシート数を取得し、その範囲でループしてCSVファイルを作成します。
![](https://assets.st-note.com/img/1681695272394-aBRynZPlRS.png?width=1200)
出来た!!!今回は2つの家具を重ねてジョイントする収納です。
ここでのエラー処理
実はここで結構エラー出てました。
エラーも、慣れですね。もうエラーコードをガンガン教えるだけです。
Exception has occurred: ValueError cannot convert float NaN to integer
申し訳ありません。エラーが発生した原因は、シート数がNaN(空白セル)として取得されているためです。その場合、int関数で数値に変換できません。この問題を解決するために、以下のコードでget_sheet_num関数を修正しました。
sheet_num = input_sheet_df.iloc[0, 1] になってます。 入力シートの、8行2列目のセルにデータはあります
すみません。私の説明が不十分でした。ilocは0ベースのインデックスで行と列を指定します。そのため、iloc[0, 1]は実際には1行2列目のセルを指定しています。8行2列目のセルを取得するには、iloc[7, 1]を使用してください。以下のコードでget_sheet_num関数を修正しました。
それでもまだ、1,1セルの数値を取得しています
申し訳ありません、私の認識が間違っていました。Pandasは0ベースのインデックスではなく、1ベースのインデックスを使用しています。したがって、iloc[7, 1]は正しい位置を指しています。ただし、問題はnrows=8と設定されているため、8行目までしか読み込まれていません。これを修正するために、nrows=9に設定してください。以下のコードでget_sheet_num関数を修正しました。
さて、、、僕はコピペだけして、chatGPTは毎回、上記の返答+コードを書いてくれます。
ありがたい・・・
pandasで読み込まなくても、単純に入力シートのセル8,2の読み込みだけでいける気がします
確かに、openpyxlを使って単純に入力シートのセル(8, 2)だけを読み込むこともできます。以下のコードは、get_sheet_num関数をopenpyxlを使って書き換えたものです。
openpyxlはとっても遅いですね
ごめんなさい、openpyxlは大きなエクセルファイルを読み込む際には、パフォーマンスが低下することがあります。代わりに、xlrdというライブラリを使ってみることができます。xlrdは、古いバージョンのExcelファイル(.xls)と最新のバージョン(.xlsx)の両方をサポートしていますが、.xlsm形式には対応していません。
普通の会話ですね。
ただ、openpyxlは本当に遅くて、pandasでのエクセルは、ファイルアクセスを全く感じない速度。勉強せんくても勉強になるのがいいところ。
ちなみに、全く読めないわけではなくて、少しだけテキストは読んだくらいのpythonの経験です。
もうopenpyxl諦めました。
であれば、pandasで処理したいです
了解しました。以前のpandasを使用したget_sheet_num関数に戻りましょう。nrows=9に設定して、8行目までのデータを読み込むようにします。
まとめ
以上で、エクセルからCSVファイルへの書き出しが完了しました。
今のところ、エクセルで数値を作り上げる→pythonでCSVファイルを取得。まで完成しました。今回の作業は1.5時間程度です。
穴加工や板の加工、金具設置等は今の所無視していますが、板の情報は既にオッケーになりました。
次はこれをビジュアル化したいと思います。
にわかプログラマーでもここまで出来る、chatGPTすごい!
vol4へ続く
サポートをお願いします!サポートいただいた分だけはお返し出来るようにアウトプットしていこうと思います!