У меня есть запрос 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] => ) )
Однако это должно быть что-то вроде этого
Заголовок в порядке и исправлен, но пустой столбец вызывает проблему, я не понимаю, в чем проблема и как ее решить.
Дайте мне знать, если кто-то может помочь мне решить головоломку. Спасибо!
Вы делаете очень странные вещи с ответом здесь. Почему вы добавляете эту лишнюю запятую после среднего темпа? Какой именно формат ответа? Все одной строкой? Кажется, он возвращает значения CSV, но как он различает разные строки?
@El_Vanja дает такой же ответ, как и я, я думаю, что это многострочная строка.
@JasonK Я добавил этот вывод массива. Спасибо!
Если он многострочный, то вы должны сначала взорвать новую строку, чтобы получить все строки как отдельные элементы, а затем разбить запятую, чтобы получить отдельные значения. Одна запятая, которую вы добавляете вручную после Avg Pace, не имеет никакого смысла и отбрасывает все это.
@El_Vanja, спасибо за точку зрения, не могли бы вы помочь мне с тем же? Я пытаюсь с последних двух часов, но не повезло. Спасибо!
Суть вашей проблемы в том, что вы неправильно разделяете свои данные. В приведенном вами примере кажется, что строки разделены новой строкой. Итак, первое, что вам нужно сделать, это заменить $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);
}
Это помогло бы опубликовать значение $finalData.