謙虚ライオン!
夏っぽい暑さ。
本。「話し方」の本を一通り読了。読み終わってみると、なんか大したことない本だったなーって思っちゃった。よくある内容ばかりで。「アサーション」とかの本を読んだ方がもっと勉強になる気がする。まあ「勉強」が目的ではないのだが。
より「良い」人間?になるために。努力しましょう。頑張りはしないけど。
タイトル。今日はプログラミングをちょっとやる。そのせいで絵の練習の時間が削られるという。まあちゃんとこなしましたけど。ほめてほめて〜。
それはともかく。カンマ区切りのCSVファイルを読み込んだ時、あろうことか人物名等のデータに関係ない場所の区切りをカンマでやりやがってた(こういうことがないようにきちんと仲間?の中でルールを作っておきましょう。っていうかもはや常識のレベルのミス)として、どうやって正常なファイルに戻す?という問題。カンマが入っているカラムの位置は(1箇所のみで)確定している(真ん中あたりのカラムとしてください)が、いくつ余計にカンマが入っているかは不明(入ってないこともあるし、連続して入っているかもしれない)。さて、どうする?
私の解法?の概略を説明しておく。PythonでCSVをテキストとして読み込んで、1行の中のカンマ数をカウント(str.count(“,”))。正常な数とズレていたら(多かったら)、その分だけstr.replaceを用いて文字列置換を行い(カンマを抜く)、それを新しいファイルに出力。まあ簡単な部類の問題ですね。私でも出来るのだから。
str.replaceの第三引数で該当箇所の「前からa番目まで」の数を指定して置換できるのだが、問題は置換したいカンマが真ん中にある場合にどうするか、ということ。まあ方法は色々あると思うが、(知識不足により)str.replaceのみを用いて行う方法を。
①まず間違っている部分まで(間違っている部分含む)の全てのカンマを(データに絶対に出てこないであろう)適当な文字列に置換(ここでは”<>”とする)。②間違っているカラムの位置(つまりそこまでのカンマの個数)はわかっているので、その直前までの「”<>”に置換したカンマ」をreplaceで元に戻す。これで、間違っている部分に含まれるカンマだけが”<>”に置換された状態になる。③最後に、”<>”を””(何もなし)に置換すれば完了。③で第三引数は指定しなくても良いが、心配な場合は「余分なカンマ数」にしておけば安心。
要するに、一度””に置換してしまうと元々どこにカンマがあったかわからなくなってしまうところを、”<>”を経由することで回避したってわけ。最初はテキトー文字列を”,,”にしようと思ったのだが、これだと空データの箇所も一緒に置換されてしまう可能性があるので却下。1行につき3回replaceをしているが、文字列の置換自体は短時間で出来るので(Pythonはこういう処理が得意だし)大量のデータでも処理時間的な問題は起こらない。はず。
で、この①〜③までの「流れ」を問題を持ってきた奴に説明してやったのだが、何度言っても理解してもらえなかった(図でフローを書いたりしたのに)。「そんな説明下手だから社会の役に立たないんだよ」的な文句を言われたり。オメーの頭が悪いのが悪いんだろーがよー!!!ってか中身が分からなくても実行できるようにプログラムしてやったのに、なんで(バカな癖に)理解しようとしてんの?って思っちゃたり。で、結局①〜③の間に逐一print()を噛ませて「変換過程」を可視化することでようやく理解してもらえましたとさ。はああ。そして無事全ファイルを正常な状態に戻せたようです。よかったね。
CSVファイル等の書き換えを行う場合、Excel等で読み込ませてやろうとすると(イメージ的にはわかりやすいが)データ量が膨大な場合はかなり時間がかかることもある。そういう場合は「テキストとして文字列変換」するとかなり素早く実行できますよ?という好例でした。
あと今日学んだこと。open()の第一引数はパスを指定して読み込ませることが可能。フォルダ内のファイル名(orファイルのパス)のリストは、globモジュール?を使って取り出す、os.listdir()を使って取得、とかすると良いみたいです。
以上。普通の1日。暑すぎて今年初クーラー。すずし〜。
明日も今日と同じ。気持ちを切らさずに。っていうか気持ちに関係なく実行できるように。
では。風呂入ってきます。