PHP kullanarak bir CSV dosyasından bir çok sütunlu tablo yapın

5 Cevap php

Maalesef bu biraz uzun, ama ben mümkün olduğunca detaylı olmasını istiyorsanız. Temelde, PHP kullanarak bir CSV dosyasından bir çok sütunlu bir tablo oluşturmak için çalışıyorum. Ben tablo hücreleri dikey listelemek istiyorum. Örneğin, ben isimleri ile bir CSV dosyası varsa:

bill
mike
sarah
steve
kim
dave

Ben 2 sütun gerekir varsayarsak, ben tablo dikey olarak böyle listelemek istiyorum:

bill   steve     
mike   kim   
sarah  dave

Ben tablo, bu gibi yatay listelemek istiyorum ETMEYİN:

bill   mike     
sarah  steve   
kim    dave

Ben oyuncu isimleri, takım isimleri bir CSV dosyasından bir sütun tablo yapmak için aşağıdaki kodu kullanmış - ve ben de bir ekip pozisyon niteliğindeki geçti. Ben dikey 3 sütun halinde sütun bölmek mümkün olmak istiyorum. İşte kod:

<?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>";

?>

İşte gelen çalışıyorum CSV dosyası. Göz için şimdiden çok teşekkür ederim.

CSV dosyası:

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 Cevap

Ilk öğelerden bir diziye dosyanın tamamını okuyun, sonra her satır için tekrarlayarak, bir satıra her yerinden çıktı sonra bir öğe (X istediğiniz sütun numarasıdır) X bölüme dizi bölünmüş ve.

Eğer dosyadan okumak gibi aynı döngü içinde çıktısı geçerli bir yaklaşım gördüm kadar 2. sütundaki ilk öğe ne olacağını bilmiyorum, çünkü bunu kırmaya çalışıyoruz nasıl çalışmaz tüm öğeleri.

Üzgünüm, ben soruyu yanlış anlamışım.

$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>';

İade:

bill    steve
mike    kim
sarah   dave

Eğer php mod operatörü kullanarak bölme ve dizi kopyalama önleyebilirsiniz, aşağıdaki pseudo-kodu bakın.

Edit: $ numcols değişkeni başlatılamadı Unuttum! columns herhangi bir sayı için çalışması gerekir

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>';

ya da bunun bir türevi.

Yardımlarınız için çok teşekkür ederim. Ben Dav yukarıda önerilen gibi bir dizi oluşturarak bu çalışma almak başardı. Kod biraz çirkin, ama iş yok - Ben oldukça fazla bir php acemi değilim ve ben web üzerinde bulunan örneklerle birlikte bu koymak.

Son bir soru, ben virgül dayalı CSV dosyasını ayırmak için patlayabilir fonksiyonunu kullanıyorum. Ben dizi oluşturduğunuzda fgetcsv kullanmayı tercih ediyorum 123 Elm Street, Bethesda, Maryland 20816, ama emin değilim:. Benim alanlardan biri böyle bir adres gibi birden çok virgül, varsa bu işe yaramaz korkuyorum bunu nasıl. Birisi bana yardımcı olabilir misiniz?

Ayrıca, str_getcsv benim için çalışmıyor böylece benim barındırma hizmeti php sürümü tarafından desteklenen görünmüyor.

İşte şimdiye kadar kullandığım kod - bu bana aşağıda tekrar göndeririz benim basit CSV dosyası dayalı mükemmel bir sonuç verir.

Kod:

<?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 Takım Example.csv: İşte benim CSV dosyası. İlk sütun, oyuncu adı, ikinci sütun takım adı, ve üçüncü sütun oynadıkları konumudur.

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

Tamam, sadece fgetcsv çalışma var - kullanılır hayır 'patlayacak' işlevi. Herkese teşekkürler.

<?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";
?>