これまで私の中の天才くんが覚醒して色々作成しては、忘却の彼方に追いたコードたち。
その天才くんが言い残すのは『それじゃぁもったいない!どこかに書き残しておいて』
だったらここに書いて、シェアしておこうと思います。
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;
}
取り出して配列にコンバートさえすれば、データの取扱いが楽になります。