LoginSignup
0
0

CSVファイルをJSON形式に変換する

Last updated at Posted at 2023-12-06

これまで私の中の天才くんが覚醒して色々作成しては、忘却の彼方に追いたコードたち。
その天才くんが言い残すのは『それじゃぁもったいない!どこかに書き残しておいて』

だったらここに書いて、シェアしておこうと思います。

Laravel10環境で書いています。

    /**
     * CSVファイルを1行目をキーにしたJSON形式にコンバート
     *
     * @param Request $req
     * @return array|false
     */

    public function csvConvertToJson(Request $req)
    {
        $req->validate([
            'file' => 'required|mimes:csv,txt|max:2048'
        ]);
        
        if ($req->file()) {
            $file = $req->file('file');
            $fileName = time().'_'.$file->getClientOriginalName();
            $filePath = $file->storeAs('/storage/public/uploads', $fileName);

            // CSVを読み込んでJSONに変換
            $csvData = array_map('str_getcsv', file(Storage::path($filePath)));
            array_walk($csvData, function(&$a) use ($csvData) {
                $a = array_combine($csvData[0], $a);
            });
            $titles = array_shift($csvData); // タイトル行はいらない
            $json = json_encode($csvData);

            return [
                'json_data' => $json,
                'columns_titles' => $titles,
                'file_name' => $fileName,
                'file_path' => $filePath,
            ];
        }
        return false;
    }

これを動かすには、ファイルアップロード部が必要です。
ご利用の際は、↑いい感じで作ってね。

もう1つ。これは同一のデータ番号でナンバリングされたものを、1JSONファイルに纏めてしまうもの。

    /**
     * CSVファイルのカラムタイトルとデータでJSON形式にする2
     *
     * @param Request $req
     * @return array|false
     */
    public function csvConvertToJson2(Request $req)
    {
        $req->validate([
            'file' => 'required|mimes:csv,txt|max:2048'
        ]);

        if ($req->file()) {
            $file = $req->file('file');
            $fileName = time().'_'.$file->getClientOriginalName();
            $filePath = $file->storeAs('/storage/public/uploads', $fileName);

            // CSVを読み込んでデータの準備
            $csvData = array_map('str_getcsv', file(Storage::path($filePath)));
            $columnTitles = array_shift($csvData); // $csvDataタイトル行削除し、$columnTitlesに格納

            // データ識別番号ごとにグループ化
            $groupedData = [];
            foreach ($csvData as $row) {
                $row = array_combine($columnTitles, $row);
                $identifier = $row['データ番号'] ?: 9999999999;
                $number = isset($row['データ番号']) ? $row['ナンバリング'] : [];
                $groupedData[$identifier][$number] = $row;
            }
            $json = json_encode($groupedData);

            return [
                'json_data' => $json,
                'columns_titles' => $columnTitles,
                'file_name' => $fileName,
                'file_path' => $filePath,
            ];
        }
        return false;
    }

取り出して配列にコンバートさえすれば、データの取扱いが楽になります。

X: @mighty5_development
@mighty5

0
0
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
0
0