これは主に PHP の回答ですが、方法論は実際には言語に依存しない場合があります。
単純なパーサーで CSV ファイルを実行すると、次のような多次元配列が返されました。
array( 'estimated' =>
array(
array( "TITLE" => 'MAIN', "CURR_PERF" => 100, "POT_PERF" => 75 ),
array( "TITLE" => 'HEAT', "CURR_PERF" => 90, "POT_PERF" => 60 ),
array( "TITLE" => 'CO2', "CURR_PERF" => 56, "POT_PERF" => 40 ),
),
'actual' =>
array(
array( "TITLE" => 'MAIN', "CURR_PERF" => 100, "POT_PERF" => 75 ),
array( "TITLE" => 'HEAT', "CURR_PERF" => 89 , "POT_PERF" => 75),
array( "TITLE" => 'CO2', "CURR_PERF" => 40, "POT_PERF" => 20 ),
);
);
さて、根底にあるパーサーをリファクタリングせずに片側に恐ろしいデータ構造 - 特定の順序でこれらにアクセスできることを保証するにはどうすればよいでしょうか? 基礎となるパーサーに必ずしも触れずに?
for()
/ループを使用してループするforeach()
場合は、線形の順序でのみ読み取ることができます - 要素を増加または減少させます。ドリルダウンして必要な特定の値を取得できるとは限りません。
たとえば、CSV ファイルで の値を の値とestimated
は異なる順序で表すことができますactual
。さらに別の順序で出力する必要がある場合もあります。
たとえば、次の 3 つの注文が頭に浮かびます。
-> MAIN HEAT CO2
-> HEAT MAIN CO2
-> CO2 HEAT MAIN
さらに、よくあることですが、CSV ファイル内のラベル名は正確にはユーザー フレンドリーではないため、(必要に応じて) より人間にわかりやすい名前に「変換」する必要があります。当然、必要にif()
応じて多くのステートメントを使用する必要はありません。
これは非常に特殊な使用例ですが、シリアル化されている配列に関して以前に見たことがあり、実際にネストされていることがよくあります。
考えられる解決策を 1 つ投稿しましたが、他の解決策も見ていただければ幸いです。(過去に同様のことをしたとき、私は自分の答えを受け入れたことはありません;))私が考案した方法よりもエレガントな方法があるに違いないと確信しています..!