Создайте таблицу из нескольких столбцов из файла CSV, используя PHP - PullRequest
1 голос
/ 11 августа 2009

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

bill
mike
sarah
steve
kim
dave

Предполагая, что мне нужно 2 столбца, я бы хотел, чтобы таблица располагалась по вертикали следующим образом:

bill   steve     
mike   kim   
sarah  dave

Я НЕ хочу, чтобы таблица располагалась горизонтально, например:

bill   mike     
sarah  steve   
kim    dave

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

<?PHP

$file_handle = fopen("CSV Team Example.csv", "r");

echo "<table border = '0' cellspacing='1' cellpadding='3'>\n";

while (!feof($file_handle) ) {

$line_of_text = fgetcsv($file_handle);

echo "<tr>\n<td width = '200' position = '" . $line_of_text[2] . "'>". $line_of_text[0]. "  <br> &nbsp;" . $line_of_text[1] . "</td>\n</tr>\n";

}

fclose($file_handle);

echo "</table>";

?>

Вот файл CSV, из которого я работаю. Заранее большое спасибо за внимание.

CSV-файл:

Scott L. Aranda,Red Devils,Offense
Todd D. Smith,Blue Streaks,Offense
Edward M. Grass,Red Devils,Defense
Aaron G. Frantz,Blue Streaks,Defense
Ryan V. Turner,Red Devils,Offense
Belinda J. Bridges,Red Devils,Defense
Raymond P. Webb,Blue Streaks,Offense
Allison M. Elwell,Blue Streaks,Defense
Melinda B. Savino,Blue Streaks,Offense
Wendy R. Lane,Red Devils,Offense
Gordon Q. Farmer,Blue Streaks,Defense
William F. Lawrence,Red Devils,Offense
Christa L. Limones,Blue Streaks,Offense
Sandra C. Singleton,Red Devils,Offense
Keshia M. Garcia,Blue Streaks,Defense
Margaret A. Arnold,Red Devils,Defense
Paul S. Gonzalez,Blue Streaks,Offense
Mark V. Stocks,Red Devils,Defense
Elizabeth J. Quinn,Red Devils,Offense
Rusty M. Collette,Red Devils,Offense
Myra L. Armstrong,Blue Streaks,Defense
William B. Stewart,Blue Streaks,Defense
Erin J. Hoch,Red Devils,Defense
Robin S. Meredith,Blue Streaks,Offense
Sherie D. Lee,Red Devils,Offense
Michael A. Whitney,Blue Streaks,Defense
Louis R. Ochoa,Red Devils,Defense
Paul R. Garcia,Blue Streaks,Offense
Chester A. Bailey,Red Devils,Defense
Johnny B. Coover,Red Devils,Defense
Emily K. Wright,Red Devils,Offense
Perry D. Desmarais,Red Devils,Offense
Judie J. Burns,Blue Streaks,Defense
Martin L. Dunn,Blue Streaks,Defense
Stephanie C. Rose,Blue Streaks,Defense
Don T. Grimes,Blue Streaks,Offense
Robert C. Devito,Blue Streaks,Offense
Michael J. Taylor,Red Devils,Defense
Melissa D. Bush,Red Devils,Offense

Ответы [ 5 ]

1 голос
/ 11 августа 2009

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

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

0 голосов
/ 14 августа 2009

Хорошо, все работает только с fgetcsv - не используется функция взрыва. Спасибо всем.

<?PHP
$columns = 4;

$file = fopen('CSV Team Example.csv', 'r');
$row = 0;
while (($line = fgetcsv($file)) !== FALSE) 
{  
//$line is an array of the csv elements  
list($name[], $team[], $team_position[]) = $line;
$row++;
}
$number_of_rows = $row;
fclose($file);

// calculate number of rows per column
$rows_per_column = ceil($number_of_rows / $columns);
// make your table
echo "<TABLE BORDER=\"0\">\n";

//here we changed the condition to $i < $rows
for($i = 0; $i < $rows_per_column; $i++) {

echo "<TR>\n";

//here will run another loop for the amount of columns
for($j = 0; $j < $columns; $j++) {
    echo "<td width = '200' position = '" . $team_position[$i + ($j * $rows_per_column)]  . "'>". $name[$i + ($j * $rows_per_column)] . "  <br> &nbsp;" . $team[$i + ($j * $rows_per_column)] . "</td>\n";
    }
echo "</TR>\n";
}
echo "</TABLE>\n";
?>
0 голосов
/ 12 августа 2009

Большое спасибо всем за помощь. Мне удалось заставить это работать, создав массив, как Дэв предложил выше. Код немного уродливый, но он делает свою работу - я новичок в php, и я собрал это из примеров, которые я нашел в сети.

Последний вопрос: я использую функцию разнесения для разделения файла CSV на основе запятых. Боюсь, что это не сработает, если в одном из моих полей есть несколько запятых, например, адрес: 123 Elm Street, Bethesda, Maryland 20816. Я бы предпочел использовать fgetcsv при создании массива, но я не уверен как это сделать. Кто-нибудь может мне помочь?

Кроме того, str_getcsv, похоже, не поддерживается версией php на моем хостинге, поэтому он не работает для меня.

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

Код:

<?PHP
// set the number of columns you want
$columns = 4;

// count up number of lines in your CSV file
$file_handle = fopen("CSV Team Example.csv", "r");
$row = 0;
while (!feof($file_handle) ) {
$line_of_text = fgetcsv($file_handle, 1024);
$row++;
}
$number_of_rows = $row;
fclose($file_handle);

// calculate number of rows per column
$rows_per_column = ceil($number_of_rows / $columns);

// create your array
$lines =file('CSV Team Example.csv');

foreach($lines as $data)
{
list($name[],$team[],$team_position[])
= explode(',',$data);
}

// make your table
echo "<TABLE BORDER=\"0\">\n";

//here we changed the condition to $i < $rows_per_column
for($i = 0; $i < $rows_per_column; $i++) {

    echo "<TR>\n";

    //here will run another loop for the amount of columns
    for($j = 0; $j < $columns; $j++) {
        echo "<td width = '200' position = '" . $team_position[$i + ($j * $rows_per_column)]  . "'>". $name[$i + ($j * $rows_per_column)] . "  <br> &nbsp;" . $team  [$i + ($j * $rows_per_column)] . "</td>\n";
        }
    echo "</TR>\n";
}
echo "</TABLE>\n";
?>

Вот мой CSV-файл: CSV Team Example.csv. Первый столбец - имя игрока, второй столбец - название команды, а третий столбец - позиция, которую они играют.

Scott L. Aranda,Red Devils,Offense
Todd D. Smith,Blue Streaks,Offense
Edward M. Grass,Red Devils,Defense
Aaron G. Frantz,Blue Streaks,Defense
Ryan V. Turner,Red Devils,Offense
Belinda J. Bridges,Red Devils,Defense
Raymond P. Webb,Blue Streaks,Offense
Allison M. Elwell,Blue Streaks,Defense
Melinda B. Savino,Blue Streaks,Offense
Wendy R. Lane,Red Devils,Offense
Gordon Q. Farmer,Blue Streaks,Defense
William F. Lawrence,Red Devils,Offense
Christa L. Limones,Blue Streaks,Offense
Sandra C. Singleton,Red Devils,Offense
Keshia M. Garcia,Blue Streaks,Defense
Margaret A. Arnold,Red Devils,Defense
Paul S. Gonzalez,Blue Streaks,Offense
Mark V. Stocks,Red Devils,Defense
Elizabeth J. Quinn,Red Devils,Offense
Rusty M. Collette,Red Devils,Offense
Myra L. Armstrong,Blue Streaks,Defense
William B. Stewart,Blue Streaks,Defense
Erin J. Hoch,Red Devils,Defense
Robin S. Meredith,Blue Streaks,Offense
Sherie D. Lee,Red Devils,Offense
Michael A. Whitney,Blue Streaks,Defense
Louis R. Ochoa,Red Devils,Defense
Paul R. Garcia,Blue Streaks,Offense
Chester A. Bailey,Red Devils,Defense
Johnny B. Coover,Red Devils,Defense
Emily K. Wright,Red Devils,Offense
Perry D. Desmarais,Red Devils,Offense
Judie J. Burns,Blue Streaks,Defense
Martin L. Dunn,Blue Streaks,Defense
Stephanie C. Rose,Blue Streaks,Defense
Don T. Grimes,Blue Streaks,Offense
Robert C. Devito,Blue Streaks,Offense
Michael J. Taylor,Red Devils,Defense
Melissa D. Bush,Red Devils,Offense
0 голосов
/ 11 августа 2009

см. Следующий псевдокод, вы можете избежать разбиения и копирования массива с помощью оператора mod в php.

Редактировать: Забыл инициализировать переменную $ numcols !! должно работать на любое количество столбцов

echo '<table>';
$f = file('..');
$numcols = 2;
for($i=0;$i<count($f);$i++)
{
$data = str_getcsv($f[$i]);
if($i % $numcols == 0) echo '<tr>';

// cell diplay here..
echo '<td>' . $data[???] . '</td>';

if($i+1 < count($f) && ($i+1 % $numcols) == 0) echo '</tr>';
}

echo '</table>';

или вариация этого.

0 голосов
/ 11 августа 2009

Извините, я неправильно понял вопрос.

$csv = 'bill,mike,sarah,steve,kim,dave';
$csv = str_getcsv(implode(',', explode("\n", trim($csv))), ',', '');
$columns = 2;

echo '<table border="1" cellspacing="1" cellpadding="3">';

for ($i = 0; $i < count($csv) / $columns; $i++)
{
    echo '<tr>';

    for ($j = 0; $j < $columns; $j++)
    {
        echo '<td width="200">' . $csv[$i + ($j * ($columns + 1))] . '</td>';
    }

    echo '</tr>';
}

echo '</table>';

Возвращает:

bill    steve
mike    kim
sarah   dave
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...