<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Ler ficheiro CSV ⁄ >




clicks: 18549 18549 2007-02-03 2007-02-03 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This



Neste snippet irei demonstrar uma possivel maneira de utilizar ficheiros CSV (Comma-separated values). A construção destes ficheiros é fácil, poderá ser fácil através de um qualquer editor de texto, ou mais facilmente através de uma folha de cálculo, tais como o excel ou o Calc; em que temos a possibilidade de guardar o conteúdo do ficheiro no formato CSV.

Vamos construir um snippet que permita efectuar o upload de ficheiros CSV e que pretendemos armazenar esses valores numa dada tabela.

Estas 3 funções deverão ser copiadas para o ficheiro funcoes_csv.php (que irão ver mais abaixo).

Esta será uma possivel estrutura da BD (os campos são indiferentes já que o snippet é facilmente adaptado a qualquer tipo de tabela)
  1. # Table "dados_utilizadores" DDL
  2.  
  3. CREATE TABLE `dados_utilizadores` (
  4. `pk_utilizador` tinyint(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `nome` varchar(255) NOT NULL DEFAULT '',
  6. `email` varchar(255) NOT NULL DEFAULT '',
  7. `website` varchar(255) NOT NULL DEFAULT '',
  8. PRIMARY KEY (`pk_utilizador`)
  9. ) ENGINE=MyISAM




Este será um possivel exemplo do ficheiro CSV:
  1. campo1;campo2;campo3;campo4;campo5;nome;email
  2. 1;ggdgdfg;gdfgdfgd;fhfghfg;hrhtrhrt;my name;my_email@my_domain.com
  3. 2;jgjhgjgh;ryrtyrt;rtfgbfgbf;bfbfgbf;my other name;my_other_email@my_other_domain.com
  4. 3;jgjhgjgh;ryrtyrt;rtfgbfgbf;bfbfgbf;my unknown name;my_unknown_email@my_unknown_domain.com



- funcoes_csv.php
  1. <?php
  2. /**
  3. * Fazer o parsing do ficheiro
  4. *
  5. **/
  6. function parse_csv_file($file, $columnheadings = false, $delimiter = ',', $enclosure = "\"") {
  7. $row = 1;
  8. $rows = array();
  9. $handle = fopen($file, 'r');
  10.  
  11. while (($data = fgetcsv($handle, 1000, $delimiter, $enclosure )) !== false) {
  12. if (!($columnheadings == "false") && ($row == 1)) {
  13. $headingTexts = $data;
  14. }
  15. elseif (!($columnheadings == "false")) {
  16. foreach ($data as $key => $value) {
  17. unset($data[$key]);
  18. $data[$headingTexts[$key]] = $value;
  19. }
  20. $rows[] = $data;
  21. }
  22. else {
  23. $rows[] = $data;
  24. }
  25. $row++;
  26. }
  27.  
  28. fclose($handle);
  29. return $rows;
  30. }
  31.  
  32. /**
  33. * Obter valores
  34. * @param $filename - ficheiro csv
  35. * @param $arrGetCSVFields - array que contém os campos que pretendemos
  36. * @param $column_headings - o csv contém 1 header?
  37. *
  38. */
  39. function getCSVValues($filename,$arrGetCSVFields,$column_headings=false){
  40. $arr=parse_csv_file($filename,$column_headings);
  41. $arrCSVValues=array();
  42. foreach($arr as $arrKey=>$arrValues){
  43. foreach($arrValues as $key=>$value){
  44. $arrAux=array(); //re-definir array
  45. $values=explode(";",$value); //converter string separada por ; p/ array
  46. foreach($arrGetCSVFields as $csv_key=>$csv_field_pos){ //armazenar os valores
  47. array_push($arrAux,$values[$csv_field_pos]);
  48. }
  49. array_push($arrCSVValues,$arrAux); //adicionar campos
  50. }
  51. }
  52. return $arrCSVValues;
  53. }
  54.  
  55. /**
  56. * Inserir registo CSV numa tabela
  57. *
  58. * @param $arrFields - array de campos onde irão ser armazenados os valores
  59. * @param $arrValues - array que contém os valores a armazenar na tabela
  60. * @param $table - tabela
  61. * @param $isFirstFieldPk - o 1º campo é uma chave primária?
  62. *
  63. */
  64. function insertCSVRecord($arrFields,$arrValues,$table,$isFirstFieldPk=false){
  65. $iSQL=generateSQL($arrFields,$arrValues,$table,$isFirstFieldPk);
  66. $db=connectDB();
  67. mysql_query($iSQL) or die($iSQL);
  68. mysql_close($db);
  69. }
  70.  
  71. /**
  72. *
  73. * Construir formulário de upload
  74. *
  75. *
  76. **/
  77. function buildFormUploadCSV(){
  78. return "
  79. Escolha um ficheiro CSV<br><br>
  80. <form name='frmUploadCSV' enctype='multipart/form-data' method='post' action=''>
  81. <input type='file' name='filename' size='75'>
  82. <input type='hidden' name='accao' value='uploadCSV'>
  83. <input type='submit' value='Upload'>
  84. </form>
  85. ";
  86. }
  87.  
  88. /**
  89. * @param $arrFields - array com o nome dos campos
  90. * @param $arrValues - array com o valor dos campos
  91. * @param $table - nome da tabela
  92. * @param $isFirstFieldPk - o 1º campo é uma chave primária?
  93. *
  94. */
  95. function generateSQL($arrFields,$arrValues,$table,$isFirstFieldPk=true){
  96. if(!is_array($arrFields) || !is_array($arrValues)) return "";
  97. $size=sizeof($arrFields);
  98. if($arrValues[0]>0 && $isFirstFieldPk){ //update record
  99. $sqlRestriction=" Where $arrFields[0]='$arrValues[0]' ";
  100. for($i=1;$i<$size;$i++){
  101. $iSQL.=$arrFields[$i]."='$arrValues[$i]',";
  102. }
  103. $iSQL=left($iSQL,strlen($iSQL)-1); //retirar , final
  104. $iSQL="Update $table set $iSQL $sqlRestriction";
  105. }
  106. else{ //new record
  107. $startAt=($isFirstFieldPk)?1:0;
  108. for($i=$startAt;$i<$size;$i++){
  109. $sqlFields.=$arrFields[$i].",";
  110. $sqlValues.="'$arrValues[$i]',";
  111. }
  112. $sqlFields=left($sqlFields,strlen($sqlFields)-1);
  113. $sqlValues=left($sqlValues,strlen($sqlValues)-1);
  114. $iSQL="Insert Into $table ($sqlFields) values ($sqlValues)";
  115. }
  116. return $iSQL;
  117. }
  118.  
  119. function left ($str, $howManyCharsFromLeft){
  120. return substr ($str, 0, $howManyCharsFromLeft);
  121. }
  122.  
  123. /**
  124. * Efectuar ligação à BD mySQL
  125. *
  126. * @return identificador
  127. */
  128. function connectDB(){
  129. $db = mysql_connect("servidor", "username", "password");
  130. mysql_select_db("database",$db) or die("Impossivel aceder á base de dados");
  131.  
  132. return $db;
  133. }
  134. ?>



- csv.php
  1. <?php
  2. include_once("funcoes_csv.php");
  3. $accao=$_REQUEST["accao"];
  4. ?>
  5. <html>
  6. <head>
  7. <title>CSV</title>
  8. </head>
  9.  
  10. <body>
  11. <?php
  12. if($accao=="uploadCSV"){
  13. $file = $HTTP_POST_FILES['filename']['tmp_name'];
  14.  
  15. //atenção que estes 2 arrays têm de "bater certo"
  16.  
  17. //indice dos campos que estão no CVS, que pretendemos obter
  18. // tenham só em atenção que o indice começa na posição 0
  19. $arrCSVGetFieldsValues=array(5,6);
  20.  
  21. //campos correspondentes na tabela
  22. $arrTableFields=array("nome","email");
  23.  
  24. $arrCSVValues=getCSVValues($file,$arrCSVGetFieldsValues);
  25. foreach ($arrCSVValues as $key=>$arrValues){ //percorrer o array
  26. insertCSVRecord($arrTableFields,$arrValues,$table); //função que vai inserir os registos
  27. }
  28. }
  29.  
  30. echo buildFormUploadCSV();
  31. ?>
  32. </body>
  33. </html>



Qualquer erro/ dúvida é só dizer!

nota: os meus agradecimentos ao Rui Cruz por ter apontado alguns erros que tinha no script ^_^''









clicks: 18549 18549 2007-02-03 2007-02-03 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This