TOPに戻る
鬱るんです
躁鬱病の元ITエンジニア「はまー」が心と体の模様を記した雑記帳。 大手IT企業で心身ともにぼろぼろになり退職した後、派遣のエンジニアをやったり小さなIT企業でほそぼそと働いたり、Web制作事業を立ち上げようとしたりしたが、今は就労継続支援B型事業所でリカバリーを頑張っている毎日。

今作っているプログラムはまだまだ未完成なので、細かい仕様とテスト内容を考えていた。Excelにはいろいろ制限があって、1つのセルに入力できる文字数は32,767文字まで、扱える行数は1,048,586行まで、そして表示できるセルの高さが409ポイントまで。この辺りのハンドリングをしないと、行数が死ぬほど大きかったり1つのトークがめちゃくちゃ長いようなファイルを読み込んだ時にオーバーフローしてエラーになったりちゃんと表示されなかったりする。

まだいろいろ制約や例外はあると思うが、上に書いた中で一番むずかしいのが、セルの高さの制御。この処理をする上でネックなのは、「結合したセルは高さの自動調整ができない」というExcelの仕様である。このプログラムではトーク内容を2つのセルを横に結合したセルに書き込んでいるのだが、それでは自動調整ができないため、結合したセルと同じ幅に設定したダミーのセルにトーク内容をいったん書き込み、そこで高さの自動調整をしてからその高さを取得し、そのセルは削除してから改めて本物の結合セルにトーク内容を書き込んで、先ほど取得した高さを設定するというトリッキーなことをやっている。

ただ、プログラム内ではトーク内で改行した場合、次の行に移って別セルとして出力しているため、改行が多くて縦に長いトークが途中で切れることはない。あくまでも改行なしで打ち込んだトークがいっぱい過ぎてあふれる場合である。1回のトークで改行なしにそんなにたくさん打ち込むやついるのか?と思うが、最近兄や私はPCでLINEをやっており、テキストファイルに打ち込んだ内容やウェブサイトに載っているテキストをコピペして入力することがある。そうすると手打ちではまず入力しないような長い文章が入ることはあり得る。それからPCからコピペした場合、スマホやPCのLINEの入力欄で直接入力できないタブ文字が入ったりする。このタブ文字はトーク履歴ファイルで項目の区切りとなっていおり、本文中にタブが入るとイレギュラーな行になってしまう。これが厄介で、その例外にはできる限り対処したのだが、これのせいでプログラムが必要以上にややこしくなってしまった。

話がそれたが、トーク内容が長すぎてセルの高さが409ポイントを超える(一部隠れてしまう)ときの対処方法としては、

1.トークの内容を分割して複数の行に書き込む
2.複数の行を結合して1つのトークを書き込む

が考えられる。似たような感じだがちょっと違う。トークをダミーのセルに入力して自動調整して得た高さは、入力した内容がオーバーする場合はMAX値409と返ってくる。それ以上広げられないからだ。そこで高さが409と返ってきた場合、

1の場合
トークを半分に分割し、2つのセルに分けて出力する。しかし、あまりにも長くて半分にしてもまだオーバーしたり、その半分にしてもまだオーバーしたり、ということがあり得るので再帰的な処理が必要。ちょっとややこしい処理をしないといけない。

2の場合
セルを縦に結合した場合、それぞれのセルの高さ制限は409ポイントだが、2つのセルだとその倍になる。要は結合しても1つずつのセルの高さ制限は変わらないということ。となると、トーク内容を全部1セルに入れたら本来は高さ何ポイントなのか、その高さがわかったら、全部で何セル分必要かわかるのでその分セルを結合してから書き込めばいい。

と、2の方が簡単そうに思えるのだが、肝心の「トーク内容を全部1セルに入れたら本来は何ポイントなのか」がわからない。あくまでも自動調整して返ってくるのは制限のMAX値409で、どれだけはみ出してるのかわからない。それならもう1つセルを縦に結合して自動調整して高さを取得しては・・・というところで「結合したセルは自動調整できない」という制約に引っかかる。

ということで、久しぶりだが1の処理にチャレンジしてみた。再帰的な処理というのはばしっとはまると驚くほどシンプルなコードで全体のロジックが完成することが多い。数時間かかって、試行錯誤した結果、うん、シンプルに処理することができた。かなり嬉しいのだ。再帰処理を書いたのは久しぶりだな。頭の中ではネストが深くなるとなかなかイメージしにくかったが、こういうときはビジュアル化するに限る。と言うことで絵を書いてみてようやく難所を越えた。こういうのを書いたのも久しぶりだ。

再帰処理のイメージ図

と言うわけで、一歩野望に近づいた。

次はセル内の文字数が32,767を超えた場合の処理をするだが、上の処理だけで十分な気がする。32,767文字もあったら、高さはとっくに409ポイントを超えるよな。

行数が1,048,586を超える場合はどうしよう。見やすくするためトークとトークの間に細い行を挿入しているので、実際にはトーク履歴が50万行以上を超える場合、というようなケースだが、もうそれは「書き込めるところまでしか書き込みません」という仕様でいいか・・・。全部取り込めなかったら自分でテキストファイルを分割してくれ、でもいいような気がするが、実際に50万行のテキストファイルをエディタで開いて半分ずつに保存、とかできるものなのかな(メモリが・・・)。そもそもそんなにLINEするか?私が今年の1月に機種変更してから4ヶ月間に友達とやりとりした履歴ファイルを見ると、5,700行。う~んそんなにあるか。もっとヘビーにLINEをやっててそれが2~3年分とか溜まってたら50万行くらいいくかもしれんな。ただ、そんなでかいファイル処理してたらExcelがハングすると思う。読み込み自体はストリームで1行ずつなのだが、どうだろう。


コメントする

メールアドレスは公開されません