りそなIB用CSVファイルまとめGoプログラム

私が住んでいる田舎にはUFJ銀行が存在しない。
しかし、住めば都。
そして、りそな銀行も存在しない。
それでも生活に支障はないと思い込むことで快適に生活できるのだから不思議だ。
地元になくても[ニュース](https://twitter.com/Sankei_news/status/1316227831362248704)として流れてくるぐらい有名な銀行だ。

実際はATMぐらい地元に欲しいのだが、無い物ねだりをしたところで、私のために用意してくれるとは思えない。
それでも、インターネットバンキング(通称IB)は、使える(りそな以外も使いたい)。

と言うことで、取引情報をCSVにして(手動)取得が出来る。
付け込み出来ないため、他の手段で残高確認出来るのはありがたい。
確認できるとは言え、2年前までの遡りが限界で、それより古い取引は紙の通帳のみでしか保存できない(書き込み済みが前提になるという・・・何の解決にもなっていないが)。
当時、口座を作るときに行員の口車に乗せられ、通帳を作らなかったのだが、最近作成した。
紙に記録できる状況があってもCSVファイルで管理できるのはありがたい(しつこいと思うだろうが、何せ付け込みできない生活環境だからな)。

ちょっとだけ本題。
今後もCSVファイルを取得するだろう予想は容易に想像出来る。
何はともあれ、ファイルが増えると言うことにもつながり、管理が面倒になる。

そのため、1つのファイルにまとめるようにした。

# CSVファイル
前置きが長くなるのはいつものこととして、今回は滅多に使わない口座ではあるが、あって困るものではないので、CSVファイルの統合用プログラムを作った。

## GitHub
以下に配置している。

https://github.com/chesscommands/resonaCSVIntegration

せっかくなのでプログラムの解説をしようと思ったが、複雑なことは何一つ無いため、やめた。


## 作った経緯
今回のプログラムを作るつもりは無かったが、せっかくGo言語を勉強したのだから何かしらの入出力関係に絡んだプログラムを作ろうと思い立った。
（本来の目的はGo言語の勉強のためだが・・・勉強と言うからには、解説した方が良いかな・・・。）






















## プログラムの機能
プログラムに渡した複数のCSVファイルをもとに、1つに統合する。
1つの場合は、ほぼ何もせずに出力する。
複数の場合に本領発揮し、ファイルを古い順に並べて出力する(ファイルのタイムスタンプ基準であって、中身ではない)。
また、複数ファイルの場合は、合計行を加工し、最新ファイルの残高を表示するようにした(蛇足機能？)。










### 実行
ごく普通に実行すれば良い。

![実行.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/01b85f81-d821-542f-30aa-27399f413bed.jpeg)

引数にはcsvファイルを渡す。
複数受け取れるため、上記のスクリーンショットのように、グロブで渡せる(ファイル名のべた書き不要)。
実行後は、 `りそなIB統合済みcsvファイル.txt` というファイルが出力され、この中にまとめられた取引が記録されている。

![結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/a0c727a7-d618-0527-0c03-45aa255bed90.jpeg)

実行すれば分かることだが、基本的にはCSVファイルから取引に限定した取り込みを行っている。
要は、金額は数値型として保存するため、そこに文字列がある場合、エラーになる。
CSVファイルの行頭は、タイトルが設定されており、その文字列があるため、どうしてもエラー出力が発生する。
1行目をスキップさせようとも考えたが、余計なお世話かなとも思い、辞めた。







## 不本意な部分
ファイルの入出力の勉強用に作ったのだが、思い描いたように作れなかった。
いつも通り[mattn](https://twitter.com/mattn_jp)さんに助けを求めたが、私の望んだ機能がGoには無いようで、ちまちま1カラムずつ入出力させることになった。
ファイルから任意の行のみを抜き出したり、書き出したりしたかった(seek関数がそれだと思ったが、全く違った。)。

やはり、どのプログラミング言語でも楽に実装できる部分は限度があるのだろう。
思い描いたパッケージがないから自作することこそがプログラマーの腕がなるというか、プログラミング冥利に尽きるというか・・・。

何よりデータの扱いを律儀に考えていたが、金額なども含め、一律string型で対応すればよかったと思い始めた。

そもそも[mattn](https://qiita.com/mattn)さんからは、Goではゴルーチンやチャネルを使うのが当たり前だと言われていたのに、全く使いこなせず、今年販売の本で勉強したのに、コンテキストパッケージも習得できずじまいだった。
そもそも2020年販売の本にコンテキストの説明あったか!?





















## 作成期間
17時間程度かけて作ったようだ(大雑把な集計)。
無駄な作業が多いため、熟練者達は2〜3時間もかけずに作れるだろう。

ゴルーチンの使い時が分からず、使わなかったのは、大変致命的だった。何のための勉強用開発だったのか・・・。























## 懸念点
C言語の癖が抜けきらずに悶々としているのだが、引数はポインタ渡しをすべきだったのでは無いかと思っている。
しかし、本の説明では、値を使い回す場合、値渡しをするとあった。
それでも私の実装方法はその説明に従っていないように思う。

困った。
正解が無いため、答え合わせが出来ず、困っている。

何より、厳密なテストをしたわけでは無いため、取引内容によっては二重出力されるはず。
私の取引方法は、インフラ契約の引き落としだけなので、その現象が見られず、問題ないと判断した。

そろそろGo言語用の辞典が出版されてもいいと思うのだがな・・・。























# 今後の予定。
以下、改良点。

* りそなIBからのCSV自動取得(できるのか不明)。
* 合計行をもう少し見やすくしたい(無関係な項目をnil出力したい)。
* 文字列利用での半角の長音記号を全角にしたい(日付部分は対象外と言うこと)。
* 引数に渡されたファイルを精査したい(適切なファイルのみ処理したい)。
* 書き込み時の排他制御をしたい。
* GUI画面にしたい。
* Go言語特有のゴルーチンを使いたい。
* 新旧関係なく取り込みたい。

**大量の勉強。**
	アルゴリズムの勉強。
	Go言語専用のゴルーチンなど。
		メソッドの概念もいまいち理解できなかった(それも取り込めるようになりたい)。

***キーボードの作成。***
	そろそろごみHelixキーボードの修正を再開したい。
また、ここ数年はPlanckを使っているが、キースイッチが重く感じ始めたため、軽いのに作り直したい。
そのためにも部品の取り寄せが必要だ・・・あぁ働かなければ。

何より、左右分離型が私の机周りの環境にはあっているように思う。
しかし、買い増しするのはな・・・。




## 数年前のプログラム更改
マインクラフトのセーブデータをバックアップするプログラムをPerlで組んだ。
それを今回Goに置き換えた。

[minecraftのセーブデータを管理するPerlプログラム](https://qiita.com/chesscommands/items/bf0caf40e3e9c91952b4#go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)

今回と違い、わりと短時間で作り上げたとは言え、それでも手間取ることが多かった。
一番の失敗は、こっちでもゴルーチン関数を使わなかったこと。
寂しいよ。












## 残念箇所
プログラムの作成前にアルゴリズムをある程度考えてからプログラミングに挑んだが、そのアルゴリズムはすべてお釈迦になった。
大変残念で、反省すべき点だった。
Go言語の勉強用に作成したのに、アルゴリズムを考える時間が大半だった。

あとは、就職活動を本格的に再開すること。
どうしても、アドベントカレンダ投稿用に、この程度のプログラム作成ですら無茶苦茶時間を割いてしまったこと。























# 今回の投稿感想
夏休みの宿題の感想文のような感じになってしまった。
GitHubでのリードミーファイルを充実させて、誰も彼もが使えるようにしたい。
需要は無いと思っているが・・・今時りそなだぜ。
ネットバンキングのやり方が古いと思い、[フロッピーディスク](https://twitter.com/nikkei/status/1333178500937867265)でのやりとりを考えていたが、逆だった。
今はフラッシュメモリでのやりとりも古くなりつつあるため、クラウド時代なのかな・・・それも古くなる時代が来るのだろう。
まずは勉強だ。

以上。

ちなみに、以下を参考にした。

# 参考URL
[パッケージ filepath](https://go言語.com/pkg/path/filepath/)
[逆引きGolang (ファイル)](https://ashitani.jp/golangtips/tips_file.html)
[Go言語(golang)でShiftJISのファイルをutf-8に変換する](https://dev.classmethod.jp/articles/golang-iconv/)
[Go言語(golang)でcsvの読み書き Reader/Writer](https://golang.hateblo.jp/entry/golang-encoding-csv)
[Go言語(golang) ファイルの読み書き、作成、存在確認、一行ずつ処理、コピー など](https://golang.hateblo.jp/entry/2018/11/09/163000)
[Goでファイルの特定位置から読む](https://reiki4040.hatenablog.com/entry/2018/08/13/080000)
[Go 言語の ioutil パッケージを使ってみる](https://waman.hatenablog.com/entry/2017/10/05/132727)
[Golangでの文字列・数値変換](http://matope.hatenablog.com/entry/2014/04/22/101127)
[欲張りなマッチと控え目なマッチ(最小量指定子)](https://www.javadrive.jp/perl/regex/repeat/index8.html)