2

次のような 2D リストを作成する Python スクリプトをサーバーで実行しています。

[['Header1', 'Header2', 'Header3'], ['2012-09-10 00:11:00', '61.3', '57.0'], ...]

これを、Web ページを実行している PHP スクリプトに渡します。配列を取得するために現在使用しているPHPは次のとおりです。私は行を取得しますが、明らかに[[最初と]]最後に不要なものがあります。

exec("python weatherdata.py $stationID $startdate $enddate", $pyoutput);
$vars = explode("], [", $pyoutput[0]);

私が実際にやりたいことを説明するために、「適切な」解決策が必ずあるので (私は PHP にまったく慣れていません)、ここからCSV ファイルをダウンロードするコードを適応させたいと思います。ただし、mySQL を使用して入力します。ここでのセットアップ部分は正常に機能します。

以下のジャックの回答に応じて編集

// Commented out my working parsing part
// remove the start and end square braces then split into rows
//$output = str_replace("[[","",$pyoutput);
//$output = str_replace("]]","",$output);
//$rows = explode("], [", $output[0]);

// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='data.csv');

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

foreach (preg_split('/],\s*\[/', trim($pyoutput, '[]')) as $row) {
        $data= preg_split("/',\s*'/", trim($row, "'"));
        fputcsv($data);
}
// Commented out my working write to CSV part
// write rows
//foreach ($rows as $row){
//    $row = str_replace("'","",$row);
//    $row = explode(",", $row);
//    fputcsv($output, $row);
//}
4

1 に答える 1

4

これが実行可能かどうかはわかりませんが、PHP 5.4 以降では、短い配列構文がサポートされてい[1, 2, 3]ますarray(1, 2, 3)

だから、あなたは悪を使うことができます...つまりeval()

$vars = eval(`python weatherdata.py $stationID $startdate $enddate`);

それ以外の場合、配列構文が常にその形式である場合はpreg_split()、最初に角括弧で、次に一重引用符で区切ってください。

foreach (preg_split('/],\s*\[/', trim($s, '[]')) as $row) {
        $data = preg_split("/',\s*'/", trim($row, "'"));
        print_r($data);
}

出力:

Array
(
    [0] => Header1
    [1] => Header2
    [2] => Header3
)
Array
(
    [0] => 2012-09-10 00:11:00
    [1] => 61.3
    [2] => 57.0
)
于 2012-12-14T13:39:15.517 に答える