2023年5月28日日曜日

csvからsqliteのtableを作る

 今日からしばらくは 「ズボラなpython野郎のライブラリー利用」を書く

第1回はcsvのデータからsqliteのテーブルを少ない手数で作る方法を示す。

例えば顧客マスターのデータをある程度の数を用意してプログラムの開発をしたいときにちまちまと手入力するのはつらい。
で、そんなときにお世話になるのが「なんちゃって個人情報」さん。

とりあえずこちらで適当に項目を取捨選択して5000件のcsvを用意した。

次はpythonでこのcsvファイルをsqliteのテーブルデータに変換したいのだけど前処理として2つやるべきことがある。

  1. 「なんちゃって生成」のボタンを押して落ちてくるデータの名前がdummy.cgiなので拡張子をcsvに変えておく
    おいらは「Dummy個人情報5000.csv」とした。
  2. 落ちてきたファイルの文字コードがwindows向けにshift-jisなのでutf-8に変えておく。方法はlinuxな方たちはnkfとか使うのかもしれないけどコマンドのパラメータの渡し方を調べるのが面倒だったのでvscodeで読み込んで全行を選んでencodeをutf-8に変えてから貼り直して保存してやりました。
いよいよpythonの登場。
この時の前準備はpandasをpythonのライブラリーに追加しておくこと。
準備ができたらcsvを保存したフォルダでpythonを対話モードで起動して下記の操作をする。

import pandas as pd
import sqlite3

df=pd.read_csv("Dummy個人情報5000.csv")
with sqlite3.connect("test.sqlite") as conn:
      df.to_sql("personal",conn)

以上で完了
参考(丸パクリ)にしたサイト
  1. https://note.nkmk.me/python-pandas-read-csv-tsv/
  2. https://happy-analysis.com/python/python-topic-pandas-sqlite3.html
上記の操作でcsvと同フォルダにtest.sqliteというファイルが作成される。
DB Browser for SQLite などで中を見るとpersonalというテーブルにcsvの1行目のヘッダ情報を項目名として読み込まれていることが確認できる。めでたし。

次はpythonのsqlite3ライブラリーでいろいろ読み込んでみよう。

pythonの対話形式でやるとまずは

import sqlite3

conn = sqlite3.connect("test.sqlite")
cur = conn.cursor()

cur.execute("select * from personal")

print(cur.fetchall())

cur.close()
conn.close()
まででpersonテーブルの全レコードが画面に出るけどまあ見えない。(多過ぎ)

cur.executeの中身を"select 性別, count(氏名) as 人数 from personal group by 性別" とかにすると
print(cur.fetchall())で
[('女', 2456), ('男', 2544)]
のような結果を得ることが出来た。select結果はfetchでタプルのlistになるようだ。

cur.executeの中身はcrudなら何でも通るのでinsert,update,deleteも使って自由にテーブルの中を操作できるしselect でデータレコドを抽出することも楽勝。
しかし素のsql文を毎回書くのは怠い。
pythonには「orm」つまりテーブルの操作をオブジェクトの操作として記述できるライブラリーが複数存在するので次回はその点を掘る。

2023年5月26日金曜日

方向性、今後に向けて

 ずいぶん迷走状態が続くこのブログだけど次の方向性として下記のようなことを考えていた。

  1. 8bitのBASIC(cp/mエミュレータで動かす)などで画面入力を伴うプログラムを作成。
  2. そのデータ(文字コードがshift-jisの固定長のテキストデータを想定)を変換して処理するようなプログラムを現代的な言語で書く(C#を考えていた。)
  3. それをsqliteなどに入れて1.のような仕様のプログラムがいかに簡単かつ高機能に書けるかを示す。
などを考えていたけど1.2.の関係があまりに唐突で技術的な面白みにも欠けると思えてきた。
なにより「誰得」が強過ぎて・・・もう少しマシな方向を考えねば・・

で、やはりいろんな言語をつまみ食いして人様の考案された車輪の再発明とか後追いとかに終始するとはいえもう少し面白みを持たせることを目標にする。
  1. 一番重点をおくのは.NET系の処理系を用いた実用システムの要素を研究すること。
  2. しかしms officeとかvbaとかの技術からの脱却も考える。(主にpythonとか)
  3. web系にも多少は手を伸ばす。
時間は有限だし手も短いので面白いことを食い散らかすにしても出来る限り統一感というかビジョンを持っていろんなことに首をつっこむことにしようと思う。
最近は手を動かすことが億劫になってもきているので日々楽しくコーディングをしたい。
(macとwindowsで共通のコマンドライン環境でプログラムをするというのは.netよりもpythonあたりで解決する方がずっと良い気がしてきたことも上記の理由でもある。)

さてなにから取り掛かろうか?

2023年5月13日土曜日

分かったことと、不明なことー相変わらずの半可通

 c#でdotnetでのコンパイル&ビルドやscriptをmacosとwindows11でいじってみていろいろと発見できたことがある。同じソースで動かすというのはそれなりに難しいかもしれない。

1).csprojの中のパスが異なるのでソースが同じところにあるからと言ってwinとmacでコンパイルできるわけではない。
2).net6と.net7を混在するともっと混乱は増大する。
(合わせておく方がまだマシ)
3)csxで#rでnugetするのはwinではできてもmacだと動かないことも多い。なぜだ??
4)もしwindows,macを混在させないのなら、またnugetでデータベースのドライバーを持ってきたりするのをやめるならあんまりc#にこだわる意味はない。

読んでみてなんと自分の力不足と理解度の低さに驚いたけど仕方が無い、現実だ。受け入れよう。

c#ですらこんな状態なのにf#もちょっとかじり始めたもんだから余計に混乱しているのだろうか?

これはもう一度いろいろなことを0から仕切り直す必要があるのかもしれない。方向性を探り直すことにする。


dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...