Как объединить несколько файлов CSV без повторения заголовков (используя PHP)? - PullRequest
0 голосов
/ 04 ноября 2019

Я очень новичок в PHP, и когда я объединяю несколько CSV-файлов с этим кодом, отображаются несколько заголовков. Как я могу оставить один заголовок?

Я использую сервер Ubuntu 18.04 с PHP 7.1

<?php

$csvdir = "./csv";
$csvcontent = '';
if (is_dir($csvdir)) {
    if ($handle = opendir($csvdir)) {
        while (($file = readdir($handle)) !== false) {
            if (substr($file, -4) === ".csv") {
                $csvcontent .= file_get_contents($csvdir . $file);
            }
        }
        closedir($handle);
    }
}

$result = fopen('./todos.csv', 'w');
fwrite($result, $csvcontent);
fclose($result);
?>

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Согласно этому ответу с примером кода для пропуска первых строк после получения содержимого файла:

$content = file_get_contents($filename);
$lines = explode("\n", $content);
$skipped_content = implode("\n", array_slice($lines, 2));

Вы можете изменить свой код следующим образом (хотя лично яможет просто изменить производство CSV-файлов, чтобы прекратить создавать заголовки ... так как взрыв содержимого может замедлить ваши процессы).

<?php

$got_headers = 0;
$csvdir = "./csv";
$csvcontent = '';
if (is_dir($csvdir)) {
  if ($handle = opendir($csvdir)) {
    while (($file = readdir($handle)) !== false) {
      if (substr($file, -4) === ".csv") {
        if (empty($got_headers)) {

          // get the headers the first time only
          $csvcontent .= file_get_contents($csvdir . $file);
          $got_headers = 1;
        } else {

          // now, pull the lines after the first
          $content = file_get_contents($csvdir . $file);
          $lines = explode("\n", $content);

          $csvcontent .= implode("\n", array_slice($lines, 1));
        }
      }
    }
    closedir($handle);
  }
}

$result = fopen('./todos.csv', 'w');
fwrite($result, $csvcontent);
fclose($result);
0 голосов
/ 04 ноября 2019

Это дает дополнительное преимущество: вам не нужно хранить весь полученный файл в памяти:

$files = []; // use your existing code to build a list of files

$first = true;
$out = fopen('todos.csv', 'wb');

foreach( $files as $file ) {
  $in = fopen($file, 'rb');

  $line = fread($in); // get the header line

  // write only the first file's header
  if( $first ) {
    fwrite($out, $line);
    $first = false;
  }

  // transcribe the rest of the file.
  while( $line = fread($in) ) {
    fwrite($out, $line);
  }

  fclose($in);
}

fclose($out);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...