トップ «前の日記(2025年12月10日) 最新 編集

xiphioの備忘録


2025年12月13日

_ [computer] Vinicaのダウンロードデータを整形してみました。

Vinicaが終了するとき、アップロードした画像や感想などのデータを一括ダウンロード出来る様に出来るサービスがあり、申し込みまして、自分のアップデートデータをダウンロードしました。

内容がどういう形式になっているか、一抹の不安もあったのですが、投稿データはCSV形式のデータになっていて、画像はまた別のディレクトリに入っていました。ダウンロードした圧縮ファイルを展開すると、こんなファイルやディレクトリが出来ます。

images (画像の入ったディレクトリ)
posts.csv (投稿データ)
user.csv (ユーザデータのみで、小さい)

ディレクトリimagesには、6桁から7桁の数字のサブディレクトリが投稿の数だけあるようです。ただそのサブディレクトリの番号は、posts.csvにあるデータとは何も関連性が無いのが問題です。よく見てみると、順番だけ合っています。おそらく、画像データにつけられている番号は、Vinica全体のシリアルか何かのID番号かと思います。ただ投稿データposts.csvには、その番号は入っていません。投稿日とかと関連があるかと思いましたが、何も関係なさそうです。要するに関連しているのは、単にその順番だけです。

つまり、posts.csvのN行目のデータ(ワイン)の画像は、imagesディレクトリを名前順で表示したときのN番目のサブディレクトリの中に入っていると言うだけです。例えばposts.csvで100番目のデータ(ワイン)の画像を見るためには、imagesディレクトリの中で100番目のサブディレクトリを数えて同定し、そこの中のファイルを開かなければならないと言う事、いやぁ、面倒くさい!。なので、10月に折角ダウンロードしたものの、今まで放置してありました。

いつまでも放っておけないので、どうにかしようと取りあえずcsvファイルをExcelで開いてみましたが、文字化けしています。データインポートでUTF8を指定して開くと見れましたが、所々行がおかしいです。よく見るとテキスト項目で、ダブルクオートの中で改行していのを勘案せず改行して、そこでデータが切れています。

Excelでのファイルの読み込み方をどうにか工夫すれば、きちんと読み込めるのかも知れませんが、面倒なのでここは最近使って居るNotionに読み込ませると、ちゃんとしたデータベースにしてくれました。ただ、画像と合わせるために、データの番号(行数)が必要になりますが、Notionでは、連番を自動的に振ってくれる様なプロパティ(項目)は無いようです。

またしてもChatGPTに相談して、元のCSVを加工してシリアル番号をつける、pythonのプログラムを書いてもらいました。(本当は、この位自分で書けば良いのだけど、import csvは必要なのかとか、ちゃんと動くプログラムにするには、時間がかかるよなぁ)

で、書いてくれたのが、以下の様なプログラム、流石にちゃんと書けている、、でも、記録容量もメモリも小さかった昔の時代からプログラムを書いている私には、まとめて全部読み込んでから処理ってプログラムはやっぱし書けないですね、いかにも今風。

import csv
with open("input.csv", newline="", encoding="utf-8") as f: reader = csv.reader(f) rows = list(reader)
rows[0].insert(0, "No")
for i, row in enumerate(rows[1:], start=1): row.insert(0, i)
with open("output.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerows(rows)
、、とは言え、2千行あってもこれでちゃんと動くので(すごいなぁ)、出来あがったシリアル番号付きのcsvデータをNotionに読ませて、データベースにしました。

次は画像データの方です。要するに名前の順にディレクトリをシリアル番号でリネームすれば良いのですが、簡単な方法が思い浮かばないので、またしてもChatGPTに相談しますと、PowerShellのプログラムを書いてくれました。

動作確認用
Get-ChildItem -Directory |
Where-Object { $_.Name -match '^\d+$' } |
Sort-Object { [int64]$_.Name } |
ForEach-Object -Begin { $i = 1 } -Process {
    "{0}  ->  NO_{1:D4}" -f $_.Name, $i
    $i++
}
リネーム実行版 Get-ChildItem -Directory | Where-Object { $_.Name -match '^\d+$' } | Sort-Object { [int64]$_.Name } | ForEach-Object -Begin { $i = 1 } -Process { Rename-Item $_ -NewName ("NO_{0:D4}" -f $i) $i++ }
短いですが、このプログラムは自分では書けませんね、、AI様々です。

一応、1000番目のデータと1000番目の画像が一致する事、2000番目も、最後も、データと画像が一致する事を確かめました。 画像全部で3Gちょいあるので、それまでNotionに上げるのは難しいので(出来ない事はない様だけど)、以後更新が有るデータではないので、画像だけローカルでもかまわないかな、と思います。(一応、お勧めは、「GCP:Cloud Storage + Firestore」らしいです)