php - fputs - Visualice dinámicamente un archivo CSV como una tabla HTML en una página web
php html parser (7)
Me gustaría tomar un archivo CSV que viva del lado del servidor y mostrarlo dinámicamente como una tabla html. Por ejemplo, esto:
Name, Age, Sex
"Cantor, Georg", 163, M
debería convertirse en esto:
<html><body><table>
<tr> <td>Name</td> <td>Age</td> <td>Sex</td> </tr>
<tr> <td>Cantor, Georg</td> <td>163</td> <td>M</td> </td>
</table></body></html>
Las soluciones en cualquier idioma son bienvenidas.
¿Funciona si escapas de las comillas con /?
Nombre, Edad, Sexo
"Cantor /, Georg", 163, M
La mayoría de los formatos delimitados requieren que se escape su delimitador para poder analizar correctamente.
Un ejemplo aproximado de Java:
import java.util.Iterator;
public class CsvTest {
public static void main(String[] args) {
String[] lines = { "Name, Age, Sex", "/"Cantor, Georg/", 163, M" };
StringBuilder result = new StringBuilder();
for (String head : iterator(lines[0])) {
result.append(String.format("<tr>%s</tr>/n", head));
}
for (int i=1; i < lines.length; i++) {
for (String row : iterator(lines[i])) {
result.append(String.format("<td>%s</td>/n", row));
}
}
System.out.println(String.format("<table>/n%s</table>", result.toString()));
}
public static Iterable<String> iterator(final String line) {
return new Iterable<String>() {
public Iterator<String> iterator() {
return new Iterator<String>() {
private int position = 0;
public boolean hasNext() {
return position < line.length();
}
public String next() {
boolean inquote = false;
StringBuilder buffer = new StringBuilder();
for (; position < line.length(); position++) {
char c = line.charAt(position);
if (c == ''"'') {
inquote = !inquote;
}
if (c == '','' && !inquote) {
position++;
break;
} else {
buffer.append(c);
}
}
return buffer.toString().trim();
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}
Aquí hay una función simple para convertir csv en tabla html usando php:
function jj_readcsv($filename, $header=false) {
$handle = fopen($filename, "r");
echo ''<table>'';
//display header row if true
if ($header) {
$csvcontents = fgetcsv($handle);
echo ''<tr>'';
foreach ($csvcontents as $headercolumn) {
echo "<th>$headercolumn</th>";
}
echo ''</tr>'';
}
// displaying contents
while ($csvcontents = fgetcsv($handle)) {
echo ''<tr>'';
foreach ($csvcontents as $column) {
echo "<td>$column</td>";
}
echo ''</tr>'';
}
echo ''</table>'';
fclose($handle);
}
Se puede llamar a esta función como jj_readcsv(''image_links.csv'',true);
si el segundo parámetro es verdadero, la primera fila de csv se tomará como encabezado / título.
Espero que esto ayude a alguien. Comente por cualquier error en este código.
HTML ... tag puede hacerlo por sí mismo, es decir, sin PHP o Java.
o vea esta publicación para obtener detalles completos sobre lo anterior (con todas las opciones ...).
La solución previamente vinculada es una horrible pieza de código; casi cada línea contiene un error. Use fgetcsv en fgetcsv lugar:
<?php
echo "<html><body><table>/n/n";
$f = fopen("so-csv.csv", "r");
while (($line = fgetcsv($f)) !== false) {
echo "<tr>";
foreach ($line as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>/n";
}
fclose($f);
echo "/n</table></body></html>";
La respuesta de phihag pone cada fila en una sola celda, mientras que usted está pidiendo que cada valor esté en una celda separada. Esto parece hacerlo:
<?php
// Create a table from a csv file
echo "<html><body><table>/n/n";
$f = fopen("so-csv.csv", "r");
while (($line = fgetcsv($f)) !== false) {
$row = $line[0]; // We need to get the actual row (it is the first element in a 1-element array)
$cells = explode(";",$row);
echo "<tr>";
foreach ($cells as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>/n";
}
fclose($f);
echo "/n</table></body></html>";
?>
XmlGrid.net tiene una herramienta para convertir csv a html table. Aquí está el enlace: http://xmlgrid.net/csvToHtml.html
Usé sus datos de muestra y obtuve la siguiente tabla html:
<table>
<!--Created with XmlGrid Free Online XML Editor (http://xmlgrid.net)-->
<tr>
<td>Name</td>
<td> Age</td>
<td> Sex</td>
</tr>
<tr>
<td>Cantor, Georg</td>
<td> 163</td>
<td> M</td>
</tr>
</table>
definir "mostrarlo dinámicamente"? eso implica que la tabla se está construyendo a través de javascript y algún tipo de actualización Ajax-y ... si solo quieres construir la tabla usando PHP eso no es realmente lo que yo llamaría ''dinámico''