最近は銀行やクレジットカードの明細がCSV形式で手軽にダウンロードできるようになっています。確定申告や年度末の経理のために、これらのデータを活用している方も多いことでしょう。そこで、月々のCSVファイルを一つに結合するプログラムを作ってみましょう。

複数のCSVファイルを一つに結合するプログラムを作ります

○PDFとCSVの違いは?

最近ではクレジットカードの明細は、郵送されることが少なくなっており、Webにログインして確認するものが主流となっています。こうしたWebサービスでは、月々の明細をダウンロードして活用できるようになっています。また、銀行のWebサイトでも同様にダウンロードできるので、経理作業の簡易化に役立ちます。

さて、そうした明細データですが、多くは、PDF形式かCSV形式でダウンロードできるようになっています。多くのサービスでは選べるようになっています。PDFは印刷用、CSVは表計算用と大雑把に把握している方も多いことでしょう。

それで、経理作業に活用できるのは、CSV形式の方です。PDFだとデータを読み取ったり、加工したりするのが難しいからです。しかも、CSV形式は汎用性が高く、自作のプログラムからも容易に処理できるのが良いところです。

○Excelで開けるけどそもそもCSVって何なの?

パソコンの設定にもよりますが、ダウンロードしたCSVファイルは、Excelと関連づけられていて、都城は、ダブルクリックでExcelが起動するようになっていることでしょう。そのため、Excelファイルの一つと思っている人もいるかもしれません。本連載では、何度かCSVファイルについて紹介していますが、ここでは、改めてCSVファイルについて紹介します。

CSVファイルが汎用的なのは、基本的に普通のテキストファイルに、単純な規則でデータが記述されているところによります。つまり、普通にメモ帳などで開いて人間が読むことができます。

CSVはExcelでも開けるけどテキストエディタでも開ける

実際にCSVファイルをテキストエディタで開いて見てみると分かるのですが、行(横方向)が改行で区切られた一つのデータであり、列(縦方向)はカンマ「,」で区切られたデータとなっています。CSVファイルが汎用的と言われているのは、この簡易さのためです。そのため、一言で表すなら、CSV形式とは「改行とカンマで表現する二次元のデータ」と言えるでしょう。

ただし、CSVファイルの処理では、しばしば問題になるのが、文字エンコーディング(文字コード)の問題です。Excelで正しくCSV形式を開くために、多くの金融系Webサービスでは、Shift_JISでデータを出力します。最近では、Webに関連するデータは、UTF-8であることが増えてきました。そのため、サービスによっては、Shift_JISではなく、UTF-8でファイルが出力されていることもあります。文字化けしたと思ったら、文字エンコーディングの設定を疑ってみましょう。場合によっては、テキストエディタで開いて、出力コードをShift_JISに変更すると問題が解決することもあります。

○PC版のなでしこ3について

ちなみに、なでしこはもともと事務処理を自動化するために作られています。そのため、CSVファイルの処理は得意分野の一つです。本連載では、基本的にWebブラウザで実行できるなでしこ3の使い方を紹介していますが、今回は、PC版を利用してみます。PC版のなでしこ3はこちらからダウンロードできます。

さて、なでしこ3のPC版をインストールしたら、プログラムを動かしてみましょう。

なお、今回のプログラムは、macOS版とWindows版のなでしこの3.0.68で動くことを確認しています。

○複数CSVを一つに結合するプログラムを作ろう

今回作成するプログラムは、月ごとに分割されたCSVファイルを一つのCSVファイルに結合するプログラムです。

最初に、デスクトップに「csv」というフォルダを作り、その中に複数のCSVフィルをコピーしておきましょう。ちなみに、サンプルのCSVデータがこちらからダウンロードできます。

そして、Windowsなら「nakopad.vbs」を起動すると、なでしこエディタが起動するので、下記のプログラムをコピーして、なでしこエディタに貼り付けたら、最初にファイルを保存してください。プログラムを貼り付けて実行ボタンをクリックします。(macOSならTerminalを起動して「npm run nako3edit」とタイプします。するとWebブラウザが起動し、「新規作成」をクリックして表示されるエディタにプログラムを記述します。)

# -------------------------------------------------

# CSV結合.nako3

# -------------------------------------------------

# 各種設定 --- (*1)

対象CSVフォルダ=「{デスクトップ}/csv」

保存先CSV=「{デスクトップ}/all.csv」

# ファイルを列挙して読み込む --- (*2)

S=「」

「{対象CSVフォルダ}/*.csv」をファイル列挙して反復

  対象ファイル=「{対象CSVフォルダ}/{対象}」

  対象ファイルからSJISファイル読む。# --- (*3)

  それをトリムしてCSVに代入。

  S=S&CSV&改行

ここまで。

Sを表示。

# ファイルへ保存 --- (*4)

Sを保存先CSVへSJISファイル保存。

「完了」と表示。

すると、デスクトップに「all.csv」というファイルが作成されます。次の画像は、CSVというフォルダにCSVファイルを用意し、なでしこエディタでプログラムを実行したところです。

なでしこエディタにプログラムを書いて実行ボタンを押します

プログラムを確認してみましょう。(*1)の部分では、プログラムの冒頭でファイルのパスなど今後修正が必要になりそうな指定をまとめています。(*2)では指定したフォルダにあるCSVファイルを列挙して、それぞれのファイルについて繰り返し処理(反復処理)を実行します。繰り返し処理の中では、ファイルを読み込んで変数Sにファイルの内容を追記するだけの簡単な処理を記述しました。

なお、(*3)の部分では、CSVファイルを読み込みます。ただし、CSVファイルはShift_JISで書かれていることが多いので「SJISファイル読む」命令を利用してファイルを読み込みます。そして、最後に(*4)の部分では、「SJISファイル保存」命令を利用してShift_JISコードでファイルにCSVのデータを保存します。

○CSVのヘッダ行を無視するように改良してみよう

なお、プログラムを実行してみると分かりますが、CSVを読み込んで単純に内容を追記しているだけなので、繰り返しヘッダ行が追記されてしまっています。そこで、CSVの一行目をヘッダ行として無視するようにしてみましょう。

この場合、上記のプログラム(*2)の部分を以下のように書き換えると良いでしょう。

# ファイルを列挙して読み込む

S=「」

「{対象CSVフォルダ}/*.csv」をファイル列挙して反復

  対象ファイル=「{対象CSVフォルダ}/{対象}」

  対象ファイルからSJISファイル読む。

  それをトリムしてCSVに代入。

  # ヘッダ行を削除 --- (*5)

  CSVを改行で区切ってAに代入。

  Aの0を配列切り取る

  Aを改行で配列結合してCSVに代入

  S=S&CSV&改行

ここまで。

ここでは、(*5)の部分を追記したのですが、改行でデータを区切り配列に変換し、配列の0番目の要素を切り取ってまた文字列に戻すという処理にしています。

○まとめ

以上、今回はPC版のなでしこ3を利用して、複数CSVファイルを一つに結合するプログラムを紹介しました。もちろん、Webブラウザ上で使えるのも便利ですが、今回のように事務処理に使うには、PC版を利用することもできます。

ちなみに、なでしこ3は、機能面や使い勝手で、まだまだWindows版のなでしこ1に届いていませんが、少しずつバージョンアップしていますので、引き続き温かく見守ってください。よろしくお願いします。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。