Создание файла CSV с использованием PHP имеет неправильную строку

У меня есть запрос CURL и я получаю ответ, как показано ниже.

Workout Timestamp,Live/On-Demand,Instructor Name,Length (minutes),Fitness Discipline,Type,Title,Class Timestamp,Total Output,Avg. Watts,Avg. Resistance,Avg. Cadence (RPM),Avg. Speed (mph),Distance (mi),Calories Burned,Avg. Heartrate,Avg. Incline,Avg. Pace (min/mi)
2020-12-18 09:00 (CST),On Demand,Denis Morton,5,Stretching,Pre & Post-Ride Stretch,5 min Post-Ride Stretch,2020-12-16 08:00 (CST),,,,,,,12,,,
2020-12-18 10:26 (CST),On Demand,Leanne Hainsby,5,Stretching,Pre & Post-Ride Stretch,5 min Post-Ride Stretch,2020-12-13 10:45 (CST),,,,,,,,,,
2020-12-18 10:27 (CST),On Demand,Christine D'Ercole,5,Cycling,Low Impact,5 min Cool Down Ride,2020-12-18 08:00 (CST),,,,,,,,,,

Я пытаюсь создать из него файл CSV, как показано ниже.

$response = str_replace("Avg. Pace (min/mi)","Avg. Pace (min/mi),",$response);
    $data = explode(",",$response);
    
    $finalData =  array_chunk($data,18);
    
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename = "'.$csv_filename.'"');

    $fp = fopen('downloads/'.$csv_filename, 'wb'); 
        
    foreach($finalData as $finalVal)
    {
      
      $finalVal = array_map('trim', $finalVal);
      fputcsv($fp, $finalVal);

    }
    fclose($fp);

Он работает нормально, но если две или более строк и последний столбец имеют пустое значение, мой столбец не отображается должным образом в csv.

$finalData выглядит так

Array ( [0] => Array ( [0] => Workout Timestamp [1] => Live/On-Demand [2] => Instructor Name [3] => Length (minutes) [4] => Fitness Discipline [5] => Type [6] => Title [7] => Class Timestamp [8] => Total Output [9] => Avg. Watts [10] => Avg. Resistance [11] => Avg. Cadence (RPM) [12] => Avg. Speed (mph) [13] => Distance (mi) [14] => Calories Burned [15] => Avg. Heartrate [16] => Avg. Incline [17] => Avg. Pace (min/mi) ) [1] => Array ( [0] => 2020-12-18 09:00 (CST) [1] => On Demand [2] => Denis Morton [3] => 5 [4] => Stretching [5] => Pre & Post-Ride Stretch [6] => 5 min Post-Ride Stretch [7] => 2020-12-16 08:00 (CST) [8] => [9] => [10] => [11] => [12] => [13] => [14] => 12 [15] => [16] => [17] => 2020-12-18 10:26 (CST) ) [2] => Array ( [0] => On Demand [1] => Leanne Hainsby [2] => 5 [3] => Stretching [4] => Pre & Post-Ride Stretch [5] => 5 min Post-Ride Stretch [6] => 2020-12-13 10:45 (CST) [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => 2020-12-18 10:27 (CST) [17] => On Demand ) [3] => Array ( [0] => Christine D'Ercole [1] => 5 [2] => Cycling [3] => Low Impact [4] => 5 min Cool Down Ride [5] => 2020-12-18 08:00 (CST) [6] => [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => [15] => ) ) 

Однако это должно быть что-то вроде этого

Заголовок в порядке и исправлен, но пустой столбец вызывает проблему, я не понимаю, в чем проблема и как ее решить.

Дайте мне знать, если кто-то может помочь мне решить головоломку. Спасибо!

Это помогло бы опубликовать значение $finalData.

Jason K 18.12.2020 17:58

Вы делаете очень странные вещи с ответом здесь. Почему вы добавляете эту лишнюю запятую после среднего темпа? Какой именно формат ответа? Все одной строкой? Кажется, он возвращает значения CSV, но как он различает разные строки?

El_Vanja 18.12.2020 18:00

@El_Vanja дает такой же ответ, как и я, я думаю, что это многострочная строка.

Riya Shah 18.12.2020 18:03

@JasonK Я добавил этот вывод массива. Спасибо!

Riya Shah 18.12.2020 18:05

Если он многострочный, то вы должны сначала взорвать новую строку, чтобы получить все строки как отдельные элементы, а затем разбить запятую, чтобы получить отдельные значения. Одна запятая, которую вы добавляете вручную после Avg Pace, не имеет никакого смысла и отбрасывает все это.

El_Vanja 18.12.2020 18:06

@El_Vanja, спасибо за точку зрения, не могли бы вы помочь мне с тем же? Я пытаюсь с последних двух часов, но не повезло. Спасибо!

Riya Shah 18.12.2020 18:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Суть вашей проблемы в том, что вы неправильно разделяете свои данные. В приведенном вами примере кажется, что строки разделены новой строкой. Итак, первое, что вам нужно сделать, это заменить $data = explode(",",$response); на $data = explode(PHP_EOL, $response); (обратите внимание, что PHP_EOL может не сработать для вас, поскольку в ответе может использоваться другой символ, но вы можете проверить это, чтобы выяснить это).

Как только вы это сделаете, вы получите массив, содержащий каждую строку из ответа, например:

array (
  0 => 'Workout Timestamp,Live/On-Demand,Instructor Name,Length (minutes),Fitness Discipline,Type,Title,Class Timestamp,Total Output,Avg. Watts,Avg. Resistance,Avg. Cadence (RPM),Avg. Speed (mph),Distance (mi),Calories Burned,Avg. Heartrate,Avg. Incline,Avg. Pace (min/mi)',
  1 => '2020-12-18 09:00 (CST),On Demand,Denis Morton,5,Stretching,Pre & Post-Ride Stretch,5 min Post-Ride Stretch,2020-12-16 08:00 (CST),,,,,,,12,,,',
  2 => '2020-12-18 10:26 (CST),On Demand,Leanne Hainsby,5,Stretching,Pre & Post-Ride Stretch,5 min Post-Ride Stretch,2020-12-13 10:45 (CST),,,,,,,,,,',
  3 => '2020-12-18 10:27 (CST),On Demand,Christine D\'Ercole,5,Cycling,Low Impact,5 min Cool Down Ride,2020-12-18 08:00 (CST),,,,,,,,,,',
)

Затем вы можете перебрать этот массив и взорвать запятую, как вы это сделали:

foreach ($data as $row) {
    $values = array_map('trim', explode(',', $row)));
    fputcsv($fp, $values);
}

Таким образом, вы можете полностью отказаться от части $finalData = array_chunk($data,18);, так как вы больше не зависите от захвата фрагментов одинакового размера из массива всех отдельных значений.

ваши данные ответа уже в нужном формате, не нужно прогонять их через fputcsv и преобразовывать в массив и наоборот. Просто прочитайте его построчно.

  $stream = fopen('php://memory','r+');
  fwrite($stream, $response);
  rewind($stream);

  $pftarget = fopen('target.csv', 'w');
  while (($row = fgets($stream,4096)) !== false) {
      fwrite($pftarget, $row);
  }

Другие вопросы по теме