Skip to content

Instantly share code, notes, and snippets.

@hyuki

hyuki/chat.md Secret

Created April 8, 2023 06:06
Show Gist options
  • Select an option

  • Save hyuki/79ce29ce1278117fc7363e06f8bafbef to your computer and use it in GitHub Desktop.

Select an option

Save hyuki/79ce29ce1278117fc7363e06f8bafbef to your computer and use it in GitHub Desktop.
#ChatGPT と結城浩の対話:クレジットカードのサービスから入手したCSVファイルの読み取りを多言語で行ってください。

Model: GPT-4

Date: 2023-04-08

後ほどクレジットカードのサービスから入手したCSVファイルの形式を提示しますので、その入力CSVファイル"filename.csv"を読み取って解析し、適切なハッシュの配列として変数に読み込み保持するRubyのプログラムを書いてください。よろしいでしょうか。将来的に修正することを考慮して、あまり凝ったプログラムにせず、素朴に書いてくださるとうれしいです。

もちろん、お手伝いできます。Rubyを使ってCSVファイルを読み込み、適切なハッシュの配列に変換する簡単なプログラムを書きます。CSVファイルの形式がわかり次第、プログラムを完成させます。

まずは以下のプログラムを用意しておきます。CSVファイルの形式を教えていただけると、適切なハッシュの配列に変換する部分を調整できます。

require 'csv'

def read_csv_file(file_name)
  data = []

  CSV.foreach(file_name, headers: true) do |row|
    # ハッシュの生成とデータ変換を行うコードを追加します
  end

  data
end

input_file = "filename.csv"
hash_array = read_csv_file(input_file)
puts hash_array

このプログラムは、指定されたCSVファイルを読み込み、それをハッシュの配列に変換して表示します。CSVファイルの形式を教えていただければ、ハッシュの生成とデータ変換の部分を追加します。

以下に示すのがCSVファイルの形式です。日付、摘要、カテゴリー、カード名、そして金額となっています。

"2023/01/03",                            "XXXチャージ",      "未設定","WWWカード", "10000"
"2023/01/13",                            "XXXチャージ",      "未設定","WWWカード", "10000"
"2023/01/22",                              "YYYピザ",      "未設定","WWWカード",  "4170"
"2023/01/24",                            "ZZZストア",      "未設定","WWWカード", "10000"

ありがとうございます。CSVファイルの形式に基づいて、適切なハッシュの配列に変換する部分を追加したプログラムを以下に示します。

require 'csv'

def read_csv_file(file_name)
  data = []

  CSV.foreach(file_name, headers: true, header_converters: :symbol) do |row|
    hash = {
      date: row[:date],
      summary: row[:summary],
      category: row[:category],
      card_name: row[:card_name],
      amount: row[:amount].to_i
    }
    data << hash
  end

  data
end

input_file = "filename.csv"
hash_array = read_csv_file(input_file)
puts hash_array

このプログラムは、日付、摘要、カテゴリー、カード名、金額の各フィールドを持つハッシュの配列にCSVファイルの内容を変換します。CSVファイル内の金額が文字列として読み込まれるため、適切に整数に変換するために to_i メソッドを使用しています。

このプログラムでCSVファイルを正しく解析できるはずですが、もし何か問題があれば教えてください。

ありがとうございます。参考までに、同じ内容をPythonで書いたコードを見せていただけますか。

もちろんです。同じ内容をPythonで書いたコードを以下に示します。

import csv

def read_csv_file(file_name):
    data = []

    with open(file_name, newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            hash = {
                'date': row['date'],
                'summary': row['summary'],
                'category': row['category'],
                'card_name': row['card_name'],
                'amount': int(row['amount'])
            }
            data.append(hash)

    return data

input_file = 'filename.csv'
hash_array = read_csv_file(input_file)
print(hash_array)

このPythonプログラムも、日付、摘要、カテゴリー、カード名、金額の各フィールドを持つハッシュ(辞書)のリストにCSVファイルの内容を変換します。金額が文字列として読み込まれるため、適切に整数に変換するために int() 関数を使用しています。

このプログラムでCSVファイルを正しく解析できるはずですが、もし何か問題があれば教えてください。

お手数ですが、Go言語のバージョンも見たいです。

もちろんです。Go言語で同じ内容を実現するコードを以下に示します。

package main

import (
	"encoding/csv"
	"fmt"
	"os"
	"strconv"
)

type Record struct {
	Date     string
	Summary  string
	Category string
	CardName string
	Amount   int
}

func readCSVFile(filename string) ([]Record, error) {
	file, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	reader := csv.NewReader(file)
	reader.FieldsPerRecord = 5
	lines, err := reader.ReadAll()
	if err != nil {
		return nil, err
	}

	var records []Record
	for _, line := range lines[1:] {
		amount, err := strconv.Atoi(line[4])
		if err != nil {
			return nil, err
		}
		record := Record{
			Date:     line[0],
			Summary:  line[1],
			Category: line[2],
			CardName: line[3],
			Amount:   amount,
		}
		records = append(records, record)
	}

	return records, nil
}

func main() {
	filename := "filename.csv"
	hashArray, err := readCSVFile(filename)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(hashArray)
}

このGo言語のプログラムも、日付、摘要、カテゴリー、カード名、金額の各フィールドを持つ構造体のスライスにCSVファイルの内容を変換します。金額が文字列として読み込まれるため、適切に整数に変換するために strconv.Atoi() 関数を使用しています。

このプログラムでCSVファイルを正しく解析できるはずですが、もし何か問題があれば教えてください。

だいぶ趣が違いますね。ふと思ったんですが、ChatGPTさんはこれらのプログラムに与える入力CSVファイルのダミーデータをテスト用に作ることもできますか。100レコードくらいで、カード名は三種類、摘要には10種類くらいのそれらしい日用品の項目をならべて、金額は数百円から数万円まで適当にいれたものでお願いします。

もちろんです。以下に、要求に従って作成したダミーデータを含むCSVファイルの内容を示します。100レコードが含まれており、(中断)

100レコードは多すぎました。20レコードでお願いします。

すみません。20レコードのダミーデータを含むCSVファイルの内容を以下に示します。3種類のカード名、10種類のそれらしい日用品の摘要、および金額が数百円から数万円まで適当に入ったものとなっています。

date,summary,category,card_name,amount
2023/01/01,コーヒー,飲料,カードA,380
2023/01/02,ペットフード,ペット,カードB,1200
2023/01/03,電車定期券,交通,カードC,15000
2023/01/04,スーパーマーケット,食品,カードA,5000
2023/01/05,ランチ,飲食,カードB,1200
2023/01/06,映画鑑賞,エンターテイメント,カードC,1800
2023/01/07,本屋,書籍,カードA,3500
2023/01/08,電気代,光熱費,カードB,6000
2023/01/09,ガソリン,交通,カードC,4800
2023/01/10,デパートでの買い物,衣料品,カードA,20000
2023/01/11,薬局,医療費,カードB,1500
2023/01/12,外食,飲食,カードC,3500
2023/01/13,美容院,美容,カードA,8000
2023/01/14,雑貨,日用品,カードB,3000
2023/01/15,インターネット料金,通信費,カードC,4500
2023/01/16,スポーツジム,スポーツ,カードA,10000
2023/01/17,カフェ,飲料,カードB,600
2023/01/18,携帯電話代,通信費,カードC,7000
2023/01/19,水道代,光熱費,カードA,2500
2023/01/20,タクシー代,交通,カードB,1300

このダミーデータを使用して、先ほど提供したRuby、Python、およびGo言語のプログラムをテストできます。このCSVデータをファイルに保存し、ファイル名を各プログラムに与えることで、正しく動作するかどうかを確認できます。

リアリティあふれるデータをありがとうございました。たいへん参考になりました。またよろしくお願いします。

どういたしまして!お手伝いできてうれしいです。今後も質問やリクエストがございましたら、いつでもお気軽にお問い合わせください。お力になれることがあれば喜んでサポートいたします。またお会いできるのを楽しみにしています!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment