タイトル行だけ項目数が1つ少ないu-regiのcsvファイルをpandasで読み込む

u-regiには「レジクローズ情報」という名前のcsvファイルが用意されており、日別の消費税の税率ごとの売上高や入金方法が記載されているため、これをPythonで処理して弥生会計の入力用データを作成することにしました。

「Regi_Close_xxxxxx_xxx_xxxxxx.csv」という名前のcsvファイルですが、区切り文字はカンマではなくタブになっています。

また、金額欄には「¥」マークと、3桁ごとに「,」が入っています。

この「¥」マークは、半角でなく全角であるようです。(全角とみなして処理するとうまく処理できましたので)

普通にread_csvを実行すると1列目の営業日の列が欠落してしまうので、調べてみるとレジクローズ情報のcsvファイルは1行目(タイトルの行)だけが1つ列が少ない構造になっていることがわかりました。

csvファイルをWindowsの「メモ帳」などで開いて最初の行の末尾に「タブ」と何か適当な項目をダブルクォーテーションで囲って追加すれば、普通に読み込むことができます。

しかしそうすると処理するたびに前もって手動でCSVファイルを編集しなければならなくなりますので、Pythonのプログラムだけでうまく読み込むことはできないかと考えました。

やり方としては、

Dataframeの1:CSVファイルの1行目だけを読み込んで列名を取得する

df_temp1 = pd.read_csv(csv_1,encoding='utf-16'\
,skiprows=lambda x: x not in [0],delimiter='\t',engine='python')

Dataframeの2:CSVファイルの3行目以降を読み込む(2行目は月間の集計行なので不要)ヘッダーはなし、と指定することにより列名は連番が自動的に付与される

一番右の列(72番め)を削除する

df_temp2 = pd.read_csv(csv_1,encoding='utf-16'\
,skiprows = [0,1],delimiter='\t',header = None,engine='python')

df_temp2.drop(columns=df_temp2.columns[71],inplace = True)

Dataframeの1の列名をリストにして、Dataframeの2の列名を置き換える

df_temp2.columns = df_temp1.columns.tolist()

の3段階の手順となります。

他にもっと良い方法があるような気もします。

金額欄の¥マークや「,」の削除は次のようにします(この例ではDataframeの中のすべての¥マークと「,」を削除しています)。

df_temp2.replace({',': '', r'¥':''},inplace = True,regex=True)

 

タイトルとURLをコピーしました