1
2

More than 1 year has passed since last update.

csvのヘッダー行をkey、レコードをvalueとするjsonに変換するTypeScriptプログラムをChatGPTに書いてもらった

Posted at

csvのヘッダー行をkey、レコードをvalueとするjsonに変換するTypeScriptプログラムをChatGPTに書いてもらいました。

以下のようなcsvから

sample.csv

header1,header2,header3,header4
data1-1,data2-1,data3-1,data4-1
data1-2,data2-2,data3-2,data4-2
data1-3,data2-3,data3-3,data4-3

プログラムを実行し標準入力で以下のようにファイル名とカラム名を渡すことで

CSVファイル名を入力してください: sample.csv
読み込むカラム名をカンマ区切りで入力してください: header1,header3  

以下のようなjsonが出力されます。

[
  {
    "header1": "data1-1",
    "header3": "data3-1"
  },
  {
    "header1": "data1-2",
    "header3": "data3-2"
  },
  {
    "header1": "data1-3",
    "header3": "data3-3"
  }
]

コードは以下の通り。

import * as fs from 'fs';
import * as readline from 'readline';

function csvToJson(csvString: string, selectedColumns: string[] | null = null): any[] {
    const lines = csvString.split('\n');
    const headers = lines[0].split(',');

    const jsonArr: any[] = [];

    for (let i = 1; i < lines.length; i++) {
        const currentLine = lines[i].trim();

        if (!currentLine) {
            continue;
        }

        const values = currentLine.split(',');
        const jsonRow: { [key: string]: string } = {};

        for (let j = 0; j < headers.length; j++) {
            if (selectedColumns === null || selectedColumns.includes(headers[j])) {
                jsonRow[headers[j]] = values[j];
            }
        }

        jsonArr.push(jsonRow);
    }

    return jsonArr;
}

async function getUserInput(question: string): Promise<string> {
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });

    return new Promise((resolve) => {
        rl.question(question, (answer) => {
            resolve(answer);
            rl.close();
        });
    });
}

async function main() {
    try {
        const inputFilename = await getUserInput('CSVファイル名を入力してください: ');
        const columnNames = await getUserInput('読み込むカラム名をカンマ区切りで入力してください: ');

        const selectedColumns = columnNames.split(',').map((columnName) => columnName.trim());
        const csvString = await fs.promises.readFile(inputFilename, { encoding: 'utf-8' });
        const jsonArr = csvToJson(csvString, selectedColumns);

        const jsonString = JSON.stringify(jsonArr, null, 2);
        await fs.promises.writeFile('./output.json', jsonString, { encoding: 'utf-8' });

        console.log('JSONファイルが正常に生成されました。');
    } catch (error) {
        console.error('エラーが発生しました:', error);
    }
}

main();

Node.jsプロジェクトにfsとreadlineを追加し、tsファイルをtscでコンパイルして出来上がったjsファイルをnodeで実行して使います。

参考に、使用したプロンプトも記載します。

csvを読み込んで、1行目をキー、2行目以降をバリューとするjsonに変換するためのtypescriptコードを生成してください。
文字列の読み込みは、日本語のようなマルチバイトにも対応できるものとします。
カラムを指定して読み込めるように改修してください。
ファイル名と指定するカラム名を標準入力から受け取れるように修正してください。

たった3回のプロンプトでできてしまいました。

誰かの役に立てばと思い一応記事にしましたが、これくらいのプログラムであれば技術記事を探さずともChatGPTやGitHub Copilotに書いてもらった方が早いでしょうね。

もうChatGPTやGitHub Copilotがない時代には戻れません。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2