2012-08-28 3 views
0

저는 PHP에 익숙하지 않기 때문에 파일의 데이터를 폭발시키는 데 도움이 필요합니다. 문제의 파일은 다음과 같습니다. http://data.vattastic.com/vatsim-data.txt데이터 잡기 및 폭발 데이터

기본적으로 데이터는 !CLIENTS: 섹션 아래에 있습니다 (하단 근처). 이 데이터로, 나는 그것을 폭발시키고 각각 : 사이의 정보를 얻을 필요가있다.

나는이 코드를 시도했다, 그러나 그것은 나에게 변수 오프셋 오류 (Undefined offset: 3) 사람이 나를 도울 수 있다면

$file = file("http://data.vattastic.com/vatsim-data.txt"); 
foreach($file as $line) 
{ 
    $data_record = explode(":", $line); 

    // grab only the data that has "ATC" in it... 
    if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
    { 
     rest of code here... 
    } 
} 

, 나는 그것을 대단히 감사하겠습니다을 제공합니다.

+0

사용'위해서 var_dump ($의 data_record)가있는 경우에 작동합니다. 문제는'$ data_record'가 세 번째 위치를 가지지 않는다는 것입니다. – Gerep

+0

'var_dump ($ data_record)'가 해당 데이터 파일의 모든 것을 반환하고 있습니다. '! CLIENTS :'섹션 아래에서 물건을 얻는 가장 좋은 방법은 무엇입니까? – Dutchcoffee

+0

는'explode (":", $ line);'와 같이 보이는 것이 예상 한 것을 반환하지 않습니다. '$ data_record'는 액세스하려고 시도하기 전에 올바른 수의 요소를 가지고 있는지 테스트해야합니다 – peacemaker

답변

2

이 같은 행 폭발하려고하기 때문에 이러한 문제가 발생합니다 :

을; ! 일반 당신이 그 라인을 폭발 일반 설정

를 포함, 당신은 $data_records은 다음과 같습니다 당신 :

배열이 (! [0] =>; 일반에 포함 된 일반 설정)

빠른 해결책은 :

$file = file("http://data.vattastic.com/vatsim-data.txt"); 
foreach($file as $line) 
{ 
    if(strpos($line,';') === 0) continue ; // this is comment. ignoring 
    $data_record = explode(":", $line); 
    $col_count = count($data_record); 

    switch($col_count) { 
    case 42: // columns qty = 42, so this is row from `clients` 
     // grab only the data that has "ATC" in it... 
     if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
     { 
      rest of code here... 
     } 
     break; 
    default: 
     // this is other kind of data, ignoring 
     break; 
    } 
} 
+0

이것은 잘 작동하는 것 같습니다. 조금 더 시험해보고 알려 드리겠습니다. – Dutchcoffee

+0

모든 것이 제대로 작동하는 것처럼 보입니다. 당신의 도움을 주셔서 감사합니다! – Dutchcoffee

0

또 다른 해결책은 U이다 정규 표현식을 사용하고 !CLIENTS: 섹션을 찾으십시오. 이것은 또한 고객이`보다 많거나 적은 42 열 미래

$file = file_get_contents ("http://data.vattastic.com/vatsim-data.txt"); 
$matches = null; 
preg_match ('/!CLIENTS:\s\n(.*)\n;/s' , $file, $matches); 
if($matches) 
{ 
    $client_lines = explode("\n", $matches[1]); 
    foreach ($client_lines as $client) 
    { 
    $data_record = explode(":", $client); 
    if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
    { 
     //rest of code here... 
    } 
    } 
} 
+0

내 정규 표현 기술은 훌륭하지는 않지만 잘 작동하지만 문제가있는 REGEX가 있습니다. –

+0

열 번호가 변경 될 경우를 염두에 두십시오. 감사! – Dutchcoffee