Parsowanie pliku nie do końca zgodnego z *.INI

0

Plik wygląda tak:

[header]
programm_name=HeavyWeather PRO WS 2800
programm_version=1.0
file_format_version=1.0

[time]
last_actualisation="3544718402"

[weather_picture]
comment=-1=not valid, 0=rain, 1=cloud, 2=sun
number=0

[weather_tendency]
comment1=-1=not valid, 0=no change of air pressure
comment2=1=air pressure rising,  2=air pressure falling
number=2

[storm_alarm]
comment=-1=not valid, 0=storm alarm not active, 1=storm alarm active
number=-1

[indoor_temperature]
deg_C="23.2"
deg_F="73.8"

[outdoor_temperature]
deg_C="21.0"
deg_F="69.8"

[indoor_humidity]
percent="49"

[outdoor_humidity]
percent="55"

[dewpoint]
deg_C="11.6"
deg_F="52.9"

[windchill]
deg_C="20.6"
deg_F="69.1"

[wind_speed]
mps="1.8"
kmh="6.5"
mph="4.0"
knt="3.5"
bft="1"

[wind_direction]
deg="135"
name="SE"

[rain_total]
mm="0.0"
inch="0.00"

[rain_24h]
mm="0.0"
inch="0.00"

[rain_1h]
mm="0.0"
inch="0.00"

[pressure_absolute]
hpa="---"
inHg="---"

[pressure_relative]
hpa="991.8"
inHg="29.28"

W jaki sposób go parsować?
Już pierwsza linijka jest niezgodna ze standardem (alfanumeryczna bez "").
DOMDocument wymaga znaczników < i >.

Jakieś pomysły (najlepiej z przykładami) ?

0

Wygląda ale nim nie jest i ta funkcja nie zadziała... dostaję błąd że w linii 11 jest niespodziewany "=".

0
<?php
$ini = <<<EOT
[header]
programm_name=HeavyWeather PRO WS 2800
programm_version=1.0
file_format_version=1.0
 
[time]
last_actualisation="3544718402"
 
[weather_picture]
comment=-1=not valid, 0=rain, 1=cloud, 2=sun
number=0
 
[weather_tendency]
comment1=-1=not valid, 0=no change of air pressure
comment2=1=air pressure rising,  2=air pressure falling
number=2
 
[storm_alarm]
comment=-1=not valid, 0=storm alarm not active, 1=storm alarm active
number=-1
 
[indoor_temperature]
deg_C="23.2"
deg_F="73.8"
 
[outdoor_temperature]
deg_C="21.0"
deg_F="69.8"
 
[indoor_humidity]
percent="49"
 
[outdoor_humidity]
percent="55"
 
[dewpoint]
deg_C="11.6"
deg_F="52.9"
 
[windchill]
deg_C="20.6"
deg_F="69.1"
 
[wind_speed]
mps="1.8"
kmh="6.5"
mph="4.0"
knt="3.5"
bft="1"
 
[wind_direction]
deg="135"
name="SE"
 
[rain_total]
mm="0.0"
inch="0.00"
 
[rain_24h]
mm="0.0"
inch="0.00"
 
[rain_1h]
mm="0.0"
inch="0.00"
 
[pressure_absolute]
hpa="---"
inHg="---"
 
[pressure_relative]
hpa="991.8"
inHg="29.28"
EOT;

$params = parse_ini_string($ini, true, INI_SCANNER_RAW);
var_dump($params);
?>
0
$file_path = ("C:\Documents and Settings\All Users\Dane aplikacji\currdat.lst");
$ini = file_get_contents($file_path);

$params = parse_ini_string($ini, true, INI_SCANNER_RAW);
//var_dump($params);

echo $params['header']['programm_name'];

Wynik:

HeavyWeather PRO WS 2800

Dziękuję!

Parsowanie użytecznych danych z pliku currdat.lst:

date_default_timezone_set('Europe/Warsaw');

$file_path = ("C:\Documents and Settings\All Users\Dane aplikacji\currdat.lst");
$currdat = file_get_contents($file_path);

$params = parse_ini_string($currdat, true, INI_SCANNER_RAW);
//var_dump($params);

$timestamp_since_1900	=	$params['time']['last_actualisation'];
$timestamp				= 	$timestamp_since_1900 - 2208988800; //2208988800 is a difference in seconds between 1/1/1900 00:00:00 GMT/UTC and 1/1/1970 00:00:00 GMT/UTC
$datetime				=	date("Y.m.d H:i:s", $timestamp);
$date					=	date("d.m.Y H:i:s", $timestamp);

$weather_picture 		=	$params['weather_picture']['number'];	//-1 - not valid, 0 - rain, 1 - cloud, 2 - sun
$weather_tendency		=	$params['weather_tendency']['number'];	//-1 - not valid, 0 - no change, 1 - rising, 2 - falling
$storm_alarm			=	$params['storm_alarm']['number'];		//-1 - not valid, 0 - not active, 1 - active
$indoor_temp_C			=	$params['indoor_temperature']['deg_C'];
//$indoor_temp_F			=	$params['indoor_temperature']['deg_F'];
$outdoor_temp_C			=	$params['outdoor_temperature']['deg_C'];
//$outdoor_temp_F			=	$params['outdoor_temperature']['deg_F'];
$indoor_humi			=	$params['indoor_humidity']['percent'];
$outdoor_humi			=	$params['outdoor_humidity']['percent'];
$dewpoint_C				=	$params['dewpoint']['deg_C'];
//$dewpoint_F				=	$params['dewpoint']['deg_F'];
$windchill_C				=	$params['windchill']['deg_C'];
//$windchill_F				=	$params['windchill']['deg_F'];
$windspeed_mps			=	$params['wind_speed']['mps'];
$windspeed_kmh			=	$params['wind_speed']['kmh'];
//$windspeed_mph			=	$params['wind_speed']['mph'];
//$windspeed_knt			=	$params['wind_speed']['knt'];
//$windspeed_bft			=	$params['wind_speed']['bft'];
$winddir_deg			=	$params['wind_direction']['deg'];
$winddir_alpha			=	$params['wind_direction']['name'];
$rain_total_mm			=	$params['rain_total']['mm'];
//$rain_total_inch			=	$params['rain_total']['inch'];
$rain_24h_mm			=	$params['rain_24h']['mm'];
//$rain_24h_inch			=	$params['rain_24h']['inch'];
$rain_1h_mm				=	$params['rain_1h']['mm'];
//$rain_1h_inch				=	$params['rain_1h']['inch'];
//$pressure_abs_hPa		=	$params['pressure_absolute']['hpa'];
//$pressure_abs_inHg		=	$params['pressure_absolute']['inHg'];
$pressure_rel_hPa		=	$params['pressure_relative']['hpa'];
//$pressure_rel_inHg		=	$params['pressure_relative']['inHg'];
0

Wow... Moja wina, moja bardzo wielka wina :]
Powyższy przykład był po to, aby pokazać, żę się da - na Twoim miejscu użyłbym innej "odmiany" tej funkcji, a mianowicie parse_ini_file - czyta bezpośrednio z pliku :)

Zamiast czegoś takiego:

$file_path = ("C:\Documents and Settings\All Users\Dane aplikacji\currdat.lst");
$ini = file_get_contents($file_path);
 
$params = parse_ini_string($ini, true, INI_SCANNER_RAW);
//var_dump($params);
 
echo $params['header']['programm_name'];

będziesz miał:

$params = parse_ini_file("C:\Documents and Settings\All Users\Dane aplikacji\currdat.lst", true, INI_SCANNER_RAW);
//var_dump($params);

echo $params['header']['programm_name'];

1 użytkowników online, w tym zalogowanych: 0, gości: 1