2009-02-06 18 views
24

Me gustaría tomar un archivo CSV que viva en el servidor y mostrarlo dinámicamente como una tabla html. por ejemplo, esto:Muestra dinámicamente un archivo CSV como una tabla HTML en una página web

Name, Age, Sex 
"Cantor, Georg", 163, M 

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

Soluciones en cualquier idioma son bienvenidos.

Respuesta

80

El previously linked solution es una pieza horrible de la código; casi cada línea contiene un error. fgetcsv utilizar en su 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>"; 
+0

Brillante! Muchas gracias. Creo que continuaré y eliminaré ese enlace de la pregunta. – dreeves

+0

Solo quiero decir, este es el mejor código que he encontrado hasta ahora, ¡bien hecho, señor! – user2656127

+1

¡Solo copie y pegue! ¡Gracias! :) –

-1

¿Funciona si escapa de las comillas con \?

nombre, edad, sexo

"Cantor \, Georg", 163, M

formatos más delimitados requieren que su delimitador se escapó con el fin de analizar correctamente.


Un ejemplo Java áspera:

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(); 
        } 
       }; 
      } 
     }; 
    } 
} 
+0

No creo que la solución de muestra maneje eso. Pero tampoco creo que sea necesario escapar de las comas, ya que están entre comillas. (Escape de comillas, por otro lado, sí.) Por ejemplo, mysql exporta a CSV sin comillas escapadas. – dreeves

-1

definen "mostrar de forma dinámica"? eso implica que la tabla se está construyendo a través de javascript y algún tipo de actualización de Ajax-y ... si solo quieres construir la tabla usando PHP eso realmente no es lo que yo llamaría 'dinámico'

+0

Php que lo genera en el lado del servidor por solicitud web era lo suficientemente bueno para mí. Si tiene una solución ajaxy, sería genial incluirla aquí para que otros la busquen más adelante. – dreeves

10

Aquí hay una función simple para convertir csv a html tabla utilizando 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); 
} 

Uno puede llamar a esta función como jj_readcsv('image_links.csv',true);

si segundo parámetro es cierto, entonces la primera fila de csv será tomada como encabezado/título.

Espero que esto ayude a alguien. Comente por cualquier error en este código.

+1

+1 para agregar el bucle del encabezado. – jeynon

-1

XmlGrid.net tiene herramienta para convertir CSV a html mesa. Aquí está el enlace: http://xmlgrid.net/csvToHtml.html

utilicé datos de la muestra, y tengo la siguiente tabla html: Respuesta

<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> 
+1

Él dijo "dinámicamente", su solución no permite eso –

2

de phihag pone cada fila de una sola célula, mientras que usted está pidiendo para cada valor sea 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>"; 
?> 
Cuestiones relacionadas