Sep 10
Olá pessoal este semana esta com dificuldades para importar um arquivo CSV pegando o nome das colunas ou setando elas em um array para adaptar o nome das colunas com o mesmo nome dos meus fields no BD então com um pouco de pesquisa e paciência criei esta função.
O uso é simples basta indicar o caminho do arquivo e o tipo de separador que o CSV usa. O padrão é vírgula porem no Office usa ponto e vírgula.
Crie um arquivo com o nome produtos.csv e insira o código abaixo.
codigo;nome;preco;quantidade
1;lapis;1.20;2
2;borracha;0.50;10
3;caneta;1.50;20
Agora crie um arquivo converte.php e insira o código.
<?php
$caminho = "produtos.csv";
$campos = array('codigo','nome','preco','quantidade</code></span></span>');
$cvs_array = CVStoArray($caminho,$campos);
echo '<pre>';
var_dump($cvs_array);
function CVStoArray($arquivo,Array $campos=null,$separador=';') {
$ponteiro = fopen($arquivo, "r"); // Abro o arquivo para somente leitura
$colunas_nome = fgetcsv($ponteiro, 1000, $separador); // Pego a primeira linha onde tem os nomes dos campos
$numero_colunas = count($colunas_nome);// Vejo quantas colunas o CSV tem para comparar com os $campos.
if(count($campos) != $numero_colunas)
$campos = $colunas_nome;
// executo um looping até pegar todos os registros.
while($valor = fgetcsv($ponteiro, 1000, $separador)) {
$valores[] = $valor;
}
fclose($ponteiro); // fecho a conexão.
$x = 0;
$y = 0;
// Aqui eu pego as colunas e linhas e vou adicionando os valores no $array.
foreach($valores as $i) {
foreach($campos as $z) { // looping para pegar as colunas de acordo com o nome dos campos informados.
$array[$x][$z] = $i[$y];
$y++; // incremento o valor para ir para a próxima coluna.
}
$y = 0; // zero o ponteiro das colunas para ir para a próxima linha.
$x++; // incremento o valor da linha para o próximo registro
}
return $array;
}
?>
Caso tenha alguma duvida ou sugestão deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
É isso pessoal uma ótima semana e até o próximo post.
May 28
Atendendo a solicitação de um visitante do blog criei este tutorial com os princípios básicos para converter um arquivo XML em CSV.
Crie um arquivo com o nome produtos.xml e insira o código abaixo.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
<produto id='p4'>
<nome>Livro Matematica</nome>
<preco>11,00</preco>
<quantidade>10</quantidade>
</produto>
<produto id='p5'>
<nome>Apontador</nome>
<preco>1,00</preco>
<quantidade>20</quantidade>
</produto>
</catalogo>
É necessário criar um diretório com o nome csv e dar permissão de leitura e escrita antes de executar o código.
Crie um arquivo com nome xml2csv.php e coloque o código abaixo.
<?php
$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
// Defino o nome do elemento pai (root).
$root = $doc->getElementsByTagName('produto');
// Defino o nome dos elementos filhos no arquivo XML que eu desejo.
$children = array('nome','preco','quantidade');
$cvs = NULL;
// Crio o cabeçalho do arquivo CSV com o nome de todos os campos.
$cvs .= "codigo,nome,preco,quantidade";
// Quebra de linha do arquivo CSV.
$cvs .= "\n";
// Faço um loop para pegar todos os elementos pai (root) encontrados.
for ($i=0; $i < $root->length; $i++) {
// Pega o valor do atributo do elemento pai (root).
$id = $root->item($i)->getAttribute('id');
// Irei dar um escape em todos os valores usando aspas duplas.
$cvs .= '"' . $id . '",';
// Busca por elementos filhos (child) definidos no array
$valor = array();
foreach ($children as $child) {
$valor[] = '"' . $root->item($i)->getElementsByTagName($child)->item(0)->nodeValue . '"';
}
// Uso o implode para criar uma string com os valores separados por vírgula.
$cvs .= implode(',', $valor);
// Quebra de linha do arquivo CSV.
$cvs .="\n";
}
// getcwd() retorna o diretório atual.
$caminho = getcwd(). '/csv/';
$data = date('d_m_y_H_i_s');
$file_path = $caminho.$data.'_lista.csv';
// Verifique se vc tem permissão de leitura e escrita neste diretorio
if(fwrite($file=fopen($file_path,'w+'),$cvs)) {
fclose($file);
echo "Arquivo gravado com sucesso!";
} else {
echo "Erro ao abrir arquivo!";
}
?>
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
Mar 25
As funções para manipular arquivos no PHP são fopen(), fwrite() e fclose().
fopen() — Abre o arquivo
fwrite() — Escreve no arquivo
fclose() — Fecha o arquivo
Parametros para leitura e escrita em um arquivo usando fopen();
‘r’ — Abre somente para leitura e coloca o ponteiro no começo do arquivo.
‘r+’ — Abre para leitura e gravação e coloca o ponteiro no começo do arquivo.
‘w’ — Abre somente para gravação e coloca o ponteiro no começo do arquivo e apaga o conteúdo que já foi escrito. Se o arquivo não existir tenta criar.
‘w+’ — Abre para leitura e escrita e coloca o ponteiro no início do arquivo e apaga o conteúdo que já foi escrito. Se o arquivo não existir tenta criar.
‘a’ — Abre o arquivo somente para escrita e coloca o ponteiro no fim do arquivo. Se o arquivo não existir tenta criar.
‘a+’ — Abre o arquivo para leitura e gravação e coloca o ponteiro no fim do arquivo. Se o arquivo não existir tenta criar.
// getcwd() retorna o diretório atual em sucesso, ou FALSE em falha.
$caminho = getcwd(). '/csv/';
$data = date('d_m_y');
$file_path = $caminho.$data.'_lista.csv';
$dados = '';
// Nome das colunas
$dados .= 'NOME,IDADE';
$dados .="\n";
// Valores da Coluna
$dados .= 'Maria,21';
$dados .="\n";
$dados .= 'João,33';
$dados .="\n";
// Verifique se vc tem permissão de leitura e escrita neste diretorio
if(fwrite($file=fopen($file_path,'w+'),$dados)) {
fclose($file);
echo "Arquivo gravado com sucesso!";
} else {
echo "Erro ao abrir arquivo!";
}
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
Comentários Recentes