Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paulo.chagas

Retorno de arquivo .csv

Recommended Posts

Boa tarde pessoal, peço uma ajuda a vcs se possível.

Tenho um arquivo .csv com os dados abaixo:

 

CEP                PESO    ALTURA    LARGURA    COMPRIMENTO
83602230            2           16             16                    16
5060000              1            8               8                     8

 

Meu código é esse:

<?php
header('Content-Type: application/json');
$file="paulo.csv";
$csv= file_get_contents($file);
$array = array_map("str_getcsv", explode("\n", $csv));
$json = json_encode($array, JSON_PRETTY_PRINT);
print_r($json);
?>

 

Com meu código, tenho o seguinte retorno:

[
   [
       "CEP;PESO;ALTURA;LARGURA;COMPRIMENTO"
   ],
   [
       "83602230;2;16;16;16"
   ],
   [
       "5060000;1;8;8;8"
   ],
   [
       null
   ]
]

 

Mas eu preciso desse retorno abaixo

[
 {
   "CEP":83602230,
   "PESO":2,
   "ALTURA":16,
   "LARGURA":16,
   "COMPRIMENTO":16
 },
 {
   "CEP":5060000,
   "PESO":1,
   "ALTURA":8,
   "LARGURA":8,
   "COMPRIMENTO":8
 }
]

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você terá de ler o arquivo linha por linha. Veja a função fgetcsv().

 

A lógica é: leia a primeira linha. Ela terá os nomes dos campos. Da linha 2 à linha N, associe cada elemento lido aos campos lidos da primeira linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ler linha a linha seria o melhor, como o Beraldo falou acima.

 

Você conseguiria formatar a saída da forma como você deseja, independente da quantidade de linhas que tenha o arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade amigos, eu já havia feito com fgetcsv()... mas me pediram pra fazer com json ou jquery ou os dois juntos rsrs

 

Segue o código completo como fiz...funciona 100%

 

<?php  
$pasta = "arquivos/";
$permitidos = array(".csv");
$cep = $_POST['cep'];

   $user = "13241087"; //DERMO NOVO
   $pass = "9912327283"; //DERMO NOVO 9912327283

if(isset($_POST)){
   $nome_arquivo = $_FILES['arquivo']['name'];
   $ext = strtolower(strrchr($nome_arquivo,"."));
   if(in_array($ext,$permitidos)){
        $nome_atual = md5(uniqid(time())).$ext;
        $tmp = $_FILES['arquivo']['tmp_name'];
       if(move_uploaded_file($tmp,$pasta.$nome_atual)){
        }
   }else{
       echo "Aceitos apenas arquivos do tipo CSV";
   }
}

$num_linha = 1;
$arquivo = fopen("arquivos/$nome_atual", "r");

?>
<table width="100%">
 <tr>
   <td width="10%" align="center"><b>Código</b></td>
   <td width="10%" align="center"><b>Valor</b></td>
   <td width="10%" align="center"><b>Prazo entrega</b></td>
   <td width="10%" align="center"><b>Valor mão própria</b></td>
   <td width="10%" align="center"><b>Valor aviso recebimento</b></td>
   <td width="10%" align="center"><b>Valor declarado</b></td>
   <td width="10%" align="center"><b>Entrega domiciliar</b></td>
   <td width="10%" align="center"><b>Entrega sábado</b></td>
 </tr>
</table>

<?php
while (($data = fgetcsv($arquivo, 1000, ";")) !== FALSE) {    
   if ($data[0] != '') {
       $data['nCdEmpresa'] = $user;
        $data['sDsSenha'] = $pass;
        $data['sCepOrigem'] = $cep;
        $data['sCepDestino'] = $data[0];
        $data['nVlPeso'] = $data[1];
        $data['nCdFormato'] = '1';
        $data['nVlComprimento'] = $data[4];
        $data['nVlAltura'] = $data[2];
        $data['nVlLargura'] = $data[3];
        $data['nVlDiametro'] = '0';
        $data['sCdMaoPropria'] = 'n';
        $data['nVlValorDeclarado'] = '0';
        $data['sCdAvisoRecebimento'] = 'n';
        $data['StrRetorno'] = 'xml';
        $data['nCdServico'] = '40010';
        $data = http_build_query($data);

        $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx';     

        $curl = curl_init($url . '?' . $data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        $result = curl_exec($curl);
        $result = simplexml_load_string($result);

        foreach($result -> cServico as $row) {
           //Os dados de cada serviço estará aqui
            if($row -> Erro == 0) {
               ?>
               <table width="100%">
                 <tr>
                   <td width="10%" align="center"><?php echo $row -> Codigo; ?></td>
                   <td width="10%" align="center"><?php echo $row -> Valor;?></td>
                   <td width="10%" align="center"><?php echo $row -> PrazoEntrega;?></td>
                   <td width="10%" align="center"><?php echo $row -> ValorMaoPropria;?></td>
                   <td width="10%" align="center"><?php echo $row -> ValorAvisoRecebimento;?></td>
                   <td width="10%" align="center"><?php echo $row -> ValorValorDeclarado;?></td>
                   <td width="10%" align="center"><?php echo $row -> EntregaDomiciliar;?></td>
                   <td width="10%" align="center"><?php echo $row -> EntregaSabado;?></td>
                 </tr>
               </table>

               <?php
            }else {
                echo $row -> MsgErro;
            }
            echo '<hr>';

            $valor_formatado = str_replace(",",".",$row -> Valor);

            $subtotal += $valor_formatado;
        }
   }else{
       echo "A linha numero $num_linha do arquivo .csv nao possui CEP!" . "<br><br><br>";
   }
   $num_linha ++;                
}
echo "Subtotal: " . $subtotal;
fclose($arquivo);

Compartilhar este post


Link para o post
Compartilhar em outros sites

json ou jquery não influenciam em nada o uso de fgetcsv ou file_get_contents. Não entendi por que você trocou pra file_get_contents...

 

E sobre esse seu último código, qual é o problema com ele? Funciona? Dá erro? Qual?

Compartilhar este post


Link para o post
Compartilhar em outros sites

json ou jquery não influenciam em nada o uso de fgetcsv ou file_get_contents. Não entendi por que você trocou pra file_get_contents...

 

E sobre esse seu último código, qual é o problema com ele? Funciona? Dá erro? Qual?

 

Esse codigo que postei funciona perfeitamente sem erros...só que me pediram pra que não fique carregando tanto tempo a tela, por isso estou tentando obter o mesmo resultado só que com jquery...json

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tempo será o mesmo, mesmo usando Ajax.

O que dá pra fazer é que cada requisição Ajax retorna uma parcela dos resultados. Assim, a tabela será preenchida aos poucos. Mas o tempo total será praticamente o mesmo de buscar tudo de uma vez.

 

Uma coisa que pesa bastante no seu caso é esse curl dentro do loop. Você realmente precisa exibir esses valores para todos os registros? Uma alternativa é não fazer essa requisição ao carregar. Deixar para fazer via Ajax apenas nos registros desejados.

 

Se tiver que manter o curl, apenas mude a posição do curl_init. Deixe-o fora do loop, assim:

 

 

curl_init(...)
while (...)
{
   ...
  curl_setopt(...)
  curl_exec(...)
}
curl_close()

 

Isso poupa um pouco de tempo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.