【问题标题】:how to convert mysql/json file to csv file with PHP如何使用 PHP 将 mysql/json 文件转换为 csv 文件
【发布时间】:2023-03-06 16:46:01
【问题描述】:

我正在通过 JSON 文件在 Raspberry Pi 上收集 ADSB 数据;我正在使用某人的 PHP 代码,该代码从 JSON 文件生成 SQL 数据库。但是我需要一个 csv 文件来输入我开发的分析程序 (SPSS)。 这是创建 sql 数据库的 PHP 代码

    // generate sql insert statement per aircraft in range of user set alt_geom/latitude/longitude and optionally according only to hex or flight numbers in hex_code_array.txt and flight_code_array.txt
    #var_dump($hex_code_array); var_dump($flight_code_array); // show arrays for debug
    if ($user_set_array['filter_mode_database'] && $user_set_array['filter_mode_database_limited']) {
        if (($ac_alt_geom != '' && $ac_alt_geom < $user_set_array['max_alt'] && $ac_lat < $user_set_array['max_lat'] && $ac_lat > $user_set_array['min_lat'] && $ac_lon < $user_set_array['max_lon'] && $ac_lon > $user_set_array['min_lon']) && (func_wildcard_search($ac_hex, $hex_code_array, $user_set_array['filter_mode_wildcard']) || ($ac_flight != '' && func_wildcard_search($ac_flight, $flight_code_array, $user_set_array['filter_mode_wildcard'])))) {
            $sql .= "INSERT INTO aircrafts VALUES (NULL, '" . date("Y-m-d G:i:s l", $ac_now) . "', '$ac_now', '$ac_hex', '$ac_flight', '$ac_dist', ";
            $sql .= "'$ac_alt_geom', '$ac_lat', '$ac_lon', '$ac_track', '$ac_gs', '$ac_baro_rate', '$ac_seen_pos', '$ac_seen', ";
            $sql .= "'$ac_rssi', '$ac_messages', '$ac_category', '$ac_squawk', '$ac_alt_baro', '$ac_mlat', '$ac_tisb', '$message_rate');";
            $sql .= PHP_EOL;

随着我使用 PHP 的学习曲线上升,我已经修改了一些我在 Stack 的其他地方找到的代码,但它没有生成 csv 文件。我的目标是获取创建 sql 数组的变量并不断更新 csv 文件。

 $data= "id,now,hex,flight,distance,altitude,lat,long,track,gs,baro-rate,seen-pos,seen,rasi,messages,category,squark,alt-baro,mlat,tisb,rec-mag-sec\n"; 
$i = 1;
#echo $data;
$data = array(
array(  '$i' ),
array(  '$ac_id' ),
    array(  '$ac_now' ),
array(  '$ac_hex' ),
array(  '$ac_flight' ),
array(  '$ac_distance' ),
array(  '$ac_alt_geom' ),
array(  '$ac_lat' ),
array(  '$ac_long' ),
array(  '$ac_track' ),
array(  '$ac_gs' ),
array(  '$ac_baro_rate' ),
array(  '$ac_seen_pos' ),
array(  '$ac_seen' ),
array(  '$ac_rssi' ),
array(  '$ac_messages' ),
array(  '$ac_category' ),
array(  '$ac_squark' ),
array(  '$ac_alt_baro' ),
array(  '$ac_mlat' ),
array(  '$ac_tisb' ),
array(  '$ac_rec_mag_sec' ),
);
}
function outputCSV($data) {
    $outputBuffer = fopen("php://output", 'w');
    foreach($data as $val) {
        fputcsv($outputBuffer, $val);
    }
    fclose($outputBuffer);
}

$filename = 'aircrafts';
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=($filename).csv");
header("Pragama: no-cache");
hwader("Expires: 0");

outputCSV($data);

【问题讨论】:

  • 嗨@Nosajimiki 我不确定你是对的,如果我错了,对不起:),我最初是从 json 文件中读取数据,但删除了不完整的数据并将数据输入 COLUMN VARIABLES而不是数据行。所以我需要知道三件事。一,我是否正确声明了数组语句,因为变量似乎被视为文本。二,如何循环遍历 col 数组的元素。三、我是否正确使用了 fputcsv 命令。我已经广泛搜索了与我类似的示例,但找不到任何示例。感谢您的帮助

标签: php mysql csv


【解决方案1】:

首先,您似乎正在混合和匹配 2 种不同的处理数组的方法。如果您正在处理以逗号分隔的字符串开头的数据,如下所示:

$data= "1,'2019-2-15 12:00:00','#f6F0C1',1040,345,12500,32.1465,80.1263, ...";

然后你可以将 $data 转换成这样的数组:

$data = explode(",", $data);

请注意,在执行此操作时,您使用的不是变量名,而是您想要在 csv 中使用的实际原始数据。

但是,如果您的数据来自一堆变量,那么您可以像这样声明您的数组:

$data= array($i, $ac_id, $ac_now, $ac_hex, $ac_flight, $ac_distance, $ac_alt_geom, $ac_lat ...);

值得注意的是,由于 $data 数组的每个元素都只有一个值,因此您不需要将它们制作成数组。此外,因为您想将这些值称为变量,所以您不想将它们放在引号中。如果将它们放在引号中,它们将被计算为字符串而不是变量。

一旦您使用上述适当的方法创建了一个名为 $data 的数组,您需要将它推送到您的 CSV。这里要注意的另一件事是,您一次只尝试将一行放入 CSV;所以,你根本不需要循环它。循环用于当您有一个数组数组,其中每个子数组代表 CSV 文件中的一行时。由于您一次只做一行,您可以简化代码,如下所示。

function outputCSV($data) {
    $outputBuffer = fopen("php://output", 'w');  
    fputcsv($outputBuffer,$data); 
    fclose($outputBuffer); 
}

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2021-01-31
    • 1970-01-01
    • 2018-08-20
    • 2014-10-02
    相关资源
    最近更新 更多