Извлечение данных из защищенного файла TXT и превращение его в таблицу через PHP - PullRequest
0 голосов
/ 06 августа 2020

У меня есть данные о выборах, отформатированные в текстовом документе и разделенные запятыми, которые я пытаюсь переформатировать для нашего веб-сайта, используя PHP.

Текстовый файл защищен именем пользователя и паролем , поэтому я пытаюсь понять, как извлечь данные в массив, чтобы ими можно было манипулировать. Вот ссылка (https://go.elections.hawaii.gov/media-results/files/summary.txt), но я взял здесь образец данных для справки (http://lilly-digital.com/test/summary.txt).

Используя приведенный ниже код, я смог создать эту таблицу, но мне нужно переупорядочить и исключить некоторые данные: https://lilly-digital.com/test/parse.php Есть предложения, как это сделать?

<?php

$filename = 'https://lilly-digital.com/test/summary.txt';

$the_big_array = []; 

if (($h = fopen("{$filename}", "r")) !== FALSE) 
{
  while (($data = fgetcsv($h, 1000, ",")) !== FALSE) 
  {
    $the_big_array[] = $data;       
  }

  // Close the file
  fclose($h);
}

$build = '<table><tbody>';
foreach($the_big_array as $row)
{
$build .= '<tr>';
foreach($row as $item)
{
$build .= "<td>{$item}</td>";
}
$build .= '</tr>';
}
$build .= '</tbody></table>';
echo $build;

?>

В итоге, есть идеи, как извлечь данные, используя имя пользователя и пароль, и переформатировать данные? Я относительно новичок в этом.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Вы можете попробовать следующий код:

$https_user = "user_name";
$https_password = "password";

$opts = array('http' =>
  array(
    'method'  => 'GET',
    'header'  => "Content-Type: text/xml\r\n".
      "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
    'content' => $body,
    'timeout' => 60
  )
);

$https_server = 'https://lilly-digital.com/test/summary.txt';
$context  = stream_context_create($opts);
$url = $https_server;
$result = file_get_contents($url, false, $context);

$line_array = explode(PHP_EOL, $result);

$final_result = array_map(function($val) {
    return explode(',', $val);
}, $line_array);

$final_result будет представлять многомерный массив. Обработайте этот массив по своему усмотрению

0 голосов
/ 06 августа 2020

Код аутентификации Используется из ответа Ariful Islam

$https_user = "user_name";
$https_password = "password";

$opts = array('http' =>
  array(
    'method'  => 'GET',
    'header'  => "Content-Type: text/xml\r\n".
      "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
    'content' => $body,
    'timeout' => 60
  )
);

После аутентификации вы должны попробовать функцию array_combine , которая создаст массив с ключами, содержащими имена полей и значения, содержащие fielddata для таблицы Mysql. Код будет иметь вид:

$fileUrl = 'https://lilly-digital.com/test/summary.txt';
$delimiter=',';
$header = NULL;
$data = array();
if (($handle = fopen($fileUrl, 'r')) !== FALSE){
  while (($row = fgetcsv($handle,0, $delimiter)) !== FALSE)
  {
   if(!$header) 
     $header = $row;
   else 
    $data[] = array_combine($header, $row);
   }
   fclose($handle);
}

Результат будет похож на следующий

Array
(
    [0] => Array
        (
            [Contest ID] => 2
            [Contest Title] => U.S. Representative, Dist I - D
            [Contest Seq Nbr] => 2
            [Contest Type] => OF
            [Contest Party] => 
            [Absentee Mail Blank Votes] => 0
            [Absentee Walk-in Blank Votes] => 0
            [Election Blank Votes] => 0
            [Absentee Mail Over Votes] => 0
            [Absentee Walk-in Over Votes] => 0
            [Election Over Votes] => 0
            [Registered Voters] => 795248
            [Total Precincts] => 115
            [Counted Precincts] => 0
            [Candidate ID] => 9
            [Candidate Name] => CASE, Ed
            [Candidate Seq Nbr] => 1
            [Candidate Party] => 
            [Absentee Mail Votes] => 0
            [Absentee Walk-in Votes] => 0
            [Election Votes] => 0
            [Total Votes] => 0
        )

    [1] => Array ... so on

Чтобы вставить в базу данных, вам необходимо использовать следующий код

$fields = implode("','",$header);
$fields = "'".$fields."'";

foreach($data as $key => $value) {

$value = implode("','",$value);
$value = "'".$value."'";

 $sql = "INSERT INTO TABLENAME ($fields) VALUES ($value)";
}

Примечание. Настоятельно рекомендуется использовать Mysql Подготовленный отчет . Вы можете использовать приведенный выше лог c при его реализации.

0 голосов
/ 06 августа 2020

Сервер защищен с помощью HTTP Basi c Authentication , поэтому вам необходимо передать имя пользователя и пароль вместе с запросом. Вы можете сделать это с помощью stream_context_create

$username='Roland';
$password='Orzabal';

$auth = base64_encode("$username:$password");
$header = array("Authorization: Basic $auth");
$opts = array( 'http' => array ('method'=>'GET', 'header'=>$header));
$ctx = stream_context_create($opts);
//stream context is ready

$filename = 'https://lilly-digital.com/test/summary.txt';

$the_big_array = []; 

stream context - последний необязательный параметр в fopen

if (($h = fopen("{$filename}", "r", false, $context)) !== FALSE) 
{
    //stuff 
}

//other stuff 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...