2013-07-01 107 views
0

我似乎對我的fgetcsv命令有問題,而不是逗號分隔,基本上發生了什麼是我的數據只是數組中的一個非常長的字符串。我需要數據是一個數組格式的implode函數才能正常上傳到mysql數據庫。使用逗號分隔的PHP fgetcsv數組問題

目前MySQL的上傳看起來像......

INSERT INTO metars VALUES('PAJZ 011132Z AUTO 1 3/4SM BR FEW009 BKN019 OVC026 08/07 A2959 RMK AO2 PWINO TSNO P0001,PAJZ,2013-07-01T11:32:00Z,59.73,-157.27,8.0,7.0,,,,1.75,29.589567,,,TRUE,TRUE,,,TRUE,,TRUE,BR,FEW,900,BKN,1900,OVC,2600,,,IFR,,,,,,0.01,,,,,,SPECI,82.0" 

這應該讓每個元件周圍的單引號,但因爲它是一個字符串破滅不工作= \

<?php 

require_once("../config/dbmetar.php"); 

$file = "metars.csv"; 
$db = new mysqli(DB_HOST_METAR, DB_USER_METAR, DB_PASS_METAR, DB_NAME_METAR); 
$r = 0; 

if (($handle = fopen($file, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 3000, ",", '"')) !== FALSE) { 
     if ($r >= 6) { //skips the header 
      foreach($data as $i => $content) { 

       $data[$i] = $db->real_escape_string($content); 

      } 

      //echo "INSERT INTO metars VALUES('" . implode("','", $data) . '"' ; 
      //echo var_dump($data); 
      $db->query("INSERT INTO metars VALUES('" . implode("','", $data) . "');"); 

     } 
     $r++; 
    } 
    fclose($handle); 
} 

?> 

這裏的一個csv文件的例子

No errors 
Max results hit (1000): not all possible results returned; 
59 ms 
data source=metars 
948 results 
raw_text,station_id,observation_time,latitude,longitude,temp_c,dewpoint_c,wind_dir_degrees,wind_speed_kt,wind_gust_kt,visibility_statute_mi,altim_in_hg,sea_level_pressure_mb,corrected,auto,auto_station,maintenance_indicator_on,no_signal,lightning_sensor_off,freezing_rain_sensor_off,present_weather_sensor_off,wx_string,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,sky_cover,cloud_base_ft_agl,flight_category,three_hr_pressure_tendency_mb,maxT_c,minT_c,maxT24hr_c,minT24hr_c,precip_in,pcp3hr_in,pcp6hr_in,pcp24hr_in,snow_in,vert_vis_ft,metar_type,elevation_m" 
"PAJZ 011132Z AUTO 1 3/4SM BR FEW009 BKN019 OVC026 08/07 A2959 RMK AO2 PWINO TSNO P0001,PAJZ,2013-07-01T11:32:00Z,59.73,-157.27,8.0,7.0,,,,1.75,29.589567,,,TRUE,TRUE,,,TRUE,,TRUE,BR,FEW,900,BKN,1900,OVC,2600,,,IFR,,,,,,0.01,,,,,,SPECI,82.0" 
"CYOD 011131Z 18002KT 1/2SM FG FEW250 RMK CI0,CYOD,2013-07-01T11:31:00Z,54.4,-110.28,,,180,2,,0.5,,,,,,,,,,,FG,FEW,25000,,,,,,,LIFR,,,,,,,,,,,,SPECI,544.0" 
"CYYD 011131Z AUTO VRB06KT 5SM -RA BR FEW007 BKN070 OVC084 15/14 A3005 RMK PRESRR PCPN 1.0MM PAST HR SLP173 DENSITY ALT 1900FT,CYYD,2013-07-01T11:31:00Z,54.82,-127.18,15.0,14.0,0,6,,5.0,30.050198,1017.3,,TRUE,,,,,,,-RA BR,FEW,700,BKN,7000,OVC,8400,,,MVFR,,,,,,,,,,,,SPECI,523.0" 
"KNSE 011131Z 00000KT 10SM -RA FEW025 BKN070 BKN120 BKN250 23/19 A2980 RMK AO2 WSHFT 1045 RAB29 P0000 $ ,KNSE,2013-07-01T11:31:00Z,30.72,-87.02,23.0,19.0,0,0,,10.0,29.799213,,,,TRUE,TRUE,,,,,-RA,FEW,2500,BKN,7000,BKN,12000,BKN,25000,VFR,,,,,,0.0050,,,,,,SPECI,61.0" 

我一直在試圖解決這個困境約6小時w ith沒有運氣,我已經嘗試了不同的csv拉方法,如str_getcsv,fgetcsv,我已經嘗試了foreach和...簡化版本是我下面的內容,並且是更新標題信息的最簡單方法。

目的:這個PHP腳本將在cron調度程序中每隔60秒-150秒運行一次,如果您對此有任何其他建議,我也將非常感謝這些信息。

我也明白在這個問題上的任何幫助,

感謝,

-Mikael

回答

0

你可能要考慮使用file()這種類型的操作,所以你可以修剪的前幾行了並修剪CSV字符串末尾的引號。您傳遞的fgetcsv參數用於將每列包裝在引號中,而不是整個字符串。

從那裏,你就可以使用str_getcsv()

例(未經測試):

<?php 
$file = file("metars.csv"); 
for($i = 0; $i < 6; $i++) array_shift($file); 
foreach($file as $line) { 
    $line = ltrim($line, '"'); 
    $line = rtrim($line, '"'); 
    $csv = str_getcsv($line); 
    /** do query, preferably a prepared statement **/ 
} 
?> 

當然,如果你的文件是巨大的 - 這可能不是最好的解決辦法。

+0

奇妙地工作,非常感謝你! – Mikael