Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
salve salve galera do forum....
estou com um problema que está me tirano o sono, vamos lá para a explicação...
tenho um arquivo CSV com o seguinte formato
prefixo;inicial;final
243021;1000;1999
243021;2000;2999
243021;3000;3999
243021;4000;4999
243021;5000;5999
243021;6000;6999
243021;7000;7999
243021;8000;8999
243021;9000;9999
243411;1000;1999
243411;2000;2999
243411;3000;3999
243411;4000;4999
243411;5000;5999
243361;9976;9999
243364;0000;0999
243364;1000;1999
243364;2000;2999
243364;3000;3999
243364;4000;4999
243364;5000;5999
243364;6000;6999
243364;7000;7999
243364;8000;8999
243364;9000;9999
O que preciso é que enquanto estiver percorrendo as linhas do arquivo ele identifique as sequencias e agrupe pois como podem ver a linha 1 o valor inicial é 1000 e final 1999 na linha 2 o inicial é 2000 e final é 2999 portanto a linha 2 seria a continuação da linha 1 e assim por diante até a linha 9 que tem o valor final de 9999.
no final precisaria que o arquivo ficasse desta forma
prefixo;inicial;final
243021;1000;9999
243411;1000;5999
243361;9976;9999
243364;0000;9999
Opa... valeu pela resposta... mas ainda nao esta 100%...
Olha so...
Arquivo de entrada
243361;5000;5999
243361;9000;9599
243361;9000;9999
243361;9976;9999
243021;0;999
243021;1000;1999
243021;2000;2999
243021;3000;3999
243021;4000;4999
243021;5000;5999
243021;6000;6999
243021;7000;7999
243021;8000;8999
243021;9000;9999
243364;0;999
243364;1000;1999
243364;2000;2999
Arquivo de saida
243361;5000;9999
243021;0;9999
243364;0;2999
Como voce pode notar no arquivo de entrada a primeira linha deveria ser preservada pois a segunda linha nao eh a continuacao da primeira pois o final da primeira eh 5999 e o inicial da segunda eh 9000 ele so poderia juntar se a segunda linha fosse 6000.
Nao sei se esta correto mas pelo que testei aqui mudando esse if
if(!isset($arr_controle[$count+1][0]) || (isset($arr_controle[$count+1][0]) && $arr_controle[$count][0] != $arr_controle[$count+1][0])){
por esse aqui ta funcionando
if(!isset($arr_controle[$count+1][0]) || (isset($arr_controle[$count+1][0]) && $arr_controle[$count][0] != $arr_controle[$count+1][0]) || ((int)$arr_controle[$count][2]+1) != (int)$arr_controle[$count+1][1]){
se possivel da uma olhada se minha logica esta correta?
Olha como deu a saida assim:
243361;5000;5999
243361;9000;9599
243361;9000;9999
243361;9976;9999
243021;0;9999
243364;0;2999
Descubra qual a primeira e última ocorrência do código da primeira coluna.
Exemplo:
Código = 243021;
Primeira ocorrência = 243021;1000;1999
Última ocorrência = 243021;9000;9999
Na primeira ocorrência considere o primeiro número da sequência (segunda coluna).
Na última ocorrência considere o último número da sequência (terceira coluna).
Bom, fiz um exemplo para você ver:
<?php
$fp = fopen('lista.csv', "r"); // coloca aqui o nome do seu arquivo csv
$arr_controle = array(); // array que utilizaremos para adicionar os dados atuais
$count = 0;
while(($linha = fgetcsv($fp, 0, ";")) !== FALSE){ // percorro o arquivo atual e copio para a array...
// agora vamos otimizar
$nova_sequencia = true; // o regitro é novo? true ou false
$arr_saida = array(); // array de sequencia otimizada
$seq = 0; // iterador da sequencia otimizada
while( $total > $count ){
if($nova_sequencia===true){ // se for uma nova sequencia
// se nao houver proxima linha ou...
// se a primeira coluna da proxima linha for diferente da primeira coluna desta entao a sequencia será outra
if(!isset($arr_controle[$count+1][0]) || (isset($arr_controle[$count+1][0]) && $arr_controle[$count][0] != $arr_controle[$count+1][0])){
$arr_saida[$seq][2] = $arr_controle[$count][2]; // adiciono o fim da sequencia
$nova_sequencia = true; // digo que a sequencia é nova
++ $seq; // incremento o array da sequencia otimizada
}
++ $count;// incremento o array da sequencia antiga
}
// escrevendo o csv
$fp_saida = fopen ("lista_otimizada.csv", "w+"); // escrevo em outro arquivo para evitar problemas
Testei o código, deve funcionar.
Qualquer coisa basta avisar.