Заголовки столбцов PHP CSV

#php #mysql #csv

#php #mysql #csv

Вопрос:

Я экспортирую некоторые данные из опроса в CSV для использования другой командой с PHP. Я вывел свою первую строку данных как все заголовки. Но мне нужно, чтобы некоторые заголовки занимали 2 столбца, это вообще возможно.

Все заголовки указаны правильно, но мне нужно добавить две ячейки данных под некоторыми заголовками.

 header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=lite-survey-data_'.time().'.csv');

require_once ( dirname(dirname(dirname(dirname(__FILE__)))).'/wp-load.php' );

$content =build_csv_download();
$headings = convert_to_csv($content[0]);
$csv_content = convert_to_csv($content[1]);
$output = fopen('php://output', 'w');
fwrite($output, $headings);
fwrite($output, $csv_content);
  

Есть идеи?

Ответ №1:

Невозможно иметь заголовки, охватывающие два столбца, поскольку CSV — это такой базовый формат, который не позволяет вам представлять объединенные ячейки. Однако, если второй из двух столбцов не имеет заголовка (so heading,,nextheading ), то при открытии его в Excel он heading переместится в пустую ячейку.

Комментарии:

1. Это может быть ответом, который я ищу. Я забываю, насколько примитивным иногда может быть файл .csv. Просто пытаюсь сейчас. Тем не менее, приветствую предложение.

Ответ №2:

CSV не поддерживает охват столбцов. Некоторые программы, такие как Excel, могут попытаться разобраться в пропущенных заголовках или других подобных трюках, но это не даст вам действительного CSV-файла. Смотрите https://www.rfc-editor.org/rfc/rfc4180

Объедините данные с помощью несущественной строки (например, пробела или дефиса) перед созданием данных CSV. По сути, вы просто берете два столбца данных и объединяете их в один.

Самый простой способ сделать это — использовать CONCAT (docs) для объединения stings прямо из базы данных:

     SELECT 
        id,
        CONCAT(first_name, " " last_name) AS name,
        email
    FROM 
        users

 /*   Gives these results:
    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => Bob Someuser
                [email] => bob@example.com
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => George Anotheruser
                [email] => george@example.com
            )
    
    )
*/
  

Если вы не можете сделать это в запросе к базе данных, вы можете использовать array_walk (docs), чтобы сделать это постфактум:

 $headings = array(
    'First heading',
    'Second heading',
    'Third heading'
);

$one_data = array(
    'First data',
    'Second',
    'data',
    'Third data'
);
$data = array();
for ($x=0;$x<10;$x  )
    $data[] = $one_data;

print 'Before fix:';
print_r($data);

function prepare_array (amp;$item) {
    $item[1] = $item[1].' '.$item[2];
    unset($item[3]);
}
array_walk($data, "prepare_array");

print '<br><br>After fix:';
print_r($data);

function csv_array (amp;$item) {
    $item = implode(',', $item);
}
$csv = implode(',', $headings)."n";
array_walk($data, "csv_array");
$csv .= implode("n", $data);

print '<br><br>CSV:<br>'.$csv;
  

Ответ №3:

CSV не поддерживает распределение по столбцам, поэтому вам просто нужно будет поместить один и тот же заголовок поля поверх двух столбцов. Это не самая красивая вещь в мире, но и CSV — не самый гибкий формат в мире.