2009-08-11 4 views
1

PHP를 사용하여 CSV 파일에서 다중 열 테이블을 만들려고합니다. 표 셀을 세로로 나열하고 싶습니다. 내가 이름을 가진 CSV 파일이있는 경우 예를 들어, : 나는이 열을 필요로 가정PHP를 사용하여 CSV 파일에서 다중 열 테이블 만들기

bill 
mike 
sarah 
steve 
kim 
dave 

, 나는 다음과 같이 수직으로 나열하는 테이블을 싶습니다

bill steve  
mike kim 
sarah dave 

나는 테이블을 원하지 않는다 다음과 같이 수평으로 나열하려면 다음

bill mike  
sarah steve 
kim dave 

나는 선수 이름, 팀 이름의 CSV 파일에서 하나 개의 컬럼 테이블을 만들기 위해 다음 코드를 사용했다 - 그리고 나는 또한 팀의 위치 속성에 통과했다. 열을 세로로 세 열로 나눌 수 있어야합니다. 코드는 다음과 같습니다.

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

답변

1

첫 번째 항목의 배열에 전체 파일을 읽은 다음 각에서 X의 부분으로 배열 (X 원하는 열 수입니다) 후 출력 한 항목을 분할 부분을 ​​한 행에 넣고 각 행에 대해 반복합니다.

파일에서 읽는 것과 동일한 루프 내에서 출력하는 현재 방법은 두 번째 열의 첫 번째 항목이 나타날 때까지 알지 못하기 때문에 어떻게 해체하려고하는지에 대해 작동하지 않습니다. 너는 모든 항목을 보았다.

0

죄송합니다. 질문을 잘못 이해했습니다.

$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 
0

는 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

도움 주셔서 대단히 감사합니다. 나는 Dav가 위에서 제안한 것처럼 배열을 생성하여이 작업을 할 수있었습니다. 이 코드는 약간 못 생겼지 만 일을한다. 나는 PHP의 초보자이며 웹에서 찾은 예제와 함께 사용했다.

마지막 질문 하나, 나는 explode 함수를 사용하여 쉼표를 기반으로 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 팀 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

좋습니다. 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"; 
?> 
관련 문제