Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
}
]
Esqueci de dizer que é indispensável uso de json ou jquery, pq no meu arquivo csv posso ter 10 mil linhas por exemplo
justamente por causa dessas 10 mil linhas o correto é ler uma a uma, com fgetcsv em vez de ler tudo de uma vez com file_get_contents, o que poderia causar o uso total da RAM
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.
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);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?
>
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
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
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.