Pablo de Sa Postado Outubro 19, 2011 Denunciar Share Postado Outubro 19, 2011 Oi galera minha dúvida é a seguinte.Tenho uma serie de strings em arquivo de texto desta maneira.-1 30 -1 9 6 5-1 33 14 -1 29 33-1 31 -1 27 32 32-1 31 -1 -1 33 30então eu gostaria de fazer um split exatamente no terceiro espaço de cada linha.e utilizar apenas a primeira metade do split. De modo que minhas strings ficassemAssim.-1 30 -1-1 33 14-1 31 -1-1 31 -1alguém sabe me dizer como fazer esse split ? eu pesquisei que da pra fazer usandoexpressão regular, mas não sou mt experiente em perl e confesso que não consegui fazer.Agradesço a ajuda.PS: eu fiz um teste usando for, ate funcionou. Segue o pedaço do codigo abaixomy @str=split(' ', $_); for($i = 0; $i < scalar(@str)-3; $i++) { print "$str[$i] "; }mas como o arquivo de texto original tem aproximadamente 6GB fica muito ruim usar esse forpois estou demorando quase 3 horas para processar o arquivo.Por isso que gostaria de aprender a fazer o split no espaço especifico e otimizar o processo.Desde já muito obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fvox Postado Outubro 19, 2011 Denunciar Share Postado Outubro 19, 2011 Passa o parâmetro limit pro split.No seu caso, passaríamos 4. A sobra ficaria junta no último item da lista, então, é só dar um pop para remover. A manipulação é só dar um join depois. =)Exemplo:my $data = ['-1 30 -1 9 6 5', '-1 33 14 -1 29 33', '-1 31 -1 27 32 32', '-1 31 -1 -1 33 30', ]; for(@{$data}) { local @_ = split /\s+/, $_, 4; pop @_; print $_ . ' | ' for @_; print "\n"; }Output::~$ perl split.pl-1 | 30 | -1 | -1 | 33 | 14 | -1 | 31 | -1 | -1 | 31 | -1 |[]'s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pablo de Sa Postado Outubro 19, 2011 Autor Denunciar Share Postado Outubro 19, 2011 Fvox, obrigado pela resposta.Estou em reuniao no momento mais dentro de alguns minutos foi olhar o seu codigo e tentar entende-lo melhor e já lhe passoum feed back.Obrigado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fvox Postado Outubro 19, 2011 Denunciar Share Postado Outubro 19, 2011 Eita, que rápido huahuahuah.Tudo bem, cara. Quando precisar de algo, só falar. =)Abraços.[]'s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pablo de Sa Postado Outubro 19, 2011 Autor Denunciar Share Postado Outubro 19, 2011 Fvox, parece que funcionou sim. Se eu trocar o "|" por " " fica exatamente do jeito que eu preciso. Vou fazer um teste com arquivo completo.Mas voce poderia me explicar umas coisas no script que eu não entendi muito bem.1. O split esta quebrando a string em todos os espaços ou somente no espaço limite ?2. porque o split tem limite 4 ? não entendi isso.3. o que o pop ta fazendo ?Agradeço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fvox Postado Outubro 20, 2011 Denunciar Share Postado Outubro 20, 2011 (editado) Hmm, vamos por partes.1. O split esta quebrando a string em todos os espaços ou somente no espaço limite ?Não é em todos os espaços, na realidade.Ele quebra a partir do 4° espaço, que foi o limite passado como parâmetro na função split.Acho que isso já responde a pergunta número 2, certo?Mas pera aí, vamos nos aprofundar melhor:for(@{$data}) { local @_ = split /\s+/, $_, 4; p @_; # Continua... } Output: 3. o que o pop ta fazendo ? Percebeu que ali no output eu tenho exatamente o que você quer nos primeiros itens do array, mas, o último índice é todo o "resto" que você não queria? O pop faz exatamente isso. Remove o último item do array. Remove o lixo, ficando só o que você realmente quer. Depois de ter "popado" o array, é só dar um "join" e o resultado será exatamente o que você precisa: Uma escalar com o conteúdo desejado. Dando uma simplificada pra você entender melhor: my @data = ('-1 30 -1 9 6 5','-1 33 14 -1 29 33','-1 31 -1 27 32 32','-1 31 -1 -1 33 30',); for my $string (@data) { my @dividido = split /\s+/, $string, 4; pop @dividido; my $result = join ' ', @dividido; print 'Resultado: ' . $result . "\n"; }E é isso aí!Espero que tenha entendido.Desculpe a demora pra responder, mas é que to com pouco tempo livre... Trabalho e faculdade me matam! =([]'s Editado Outubro 20, 2011 por Fvox Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pablo de Sa Postado Outubro 20, 2011 Autor Denunciar Share Postado Outubro 20, 2011 Relaxa cara eu entendo isso sim, não tem problema o tempo não.Mas ficou mt legal o seu script, p**** agora eu entendi direitinho como ficou.Valeu mesmo Fvox, isso me ajudou mt cara.Conseguir reduzir o tempo de execução do meu script em 1hora e 3 min.p**** mt melhor agora.Brigadao. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Pablo de Sa
Oi galera minha dúvida é a seguinte.
Tenho uma serie de strings em arquivo de texto desta maneira.
-1 30 -1 9 6 5
-1 33 14 -1 29 33
-1 31 -1 27 32 32
-1 31 -1 -1 33 30
então eu gostaria de fazer um split exatamente no terceiro espaço de cada linha.
e utilizar apenas a primeira metade do split. De modo que minhas strings ficassem
Assim.
-1 30 -1
-1 33 14
-1 31 -1
-1 31 -1
alguém sabe me dizer como fazer esse split ? eu pesquisei que da pra fazer usando
expressão regular, mas não sou mt experiente em perl e confesso que não consegui fazer.
Agradesço a ajuda.
PS: eu fiz um teste usando for, ate funcionou. Segue o pedaço do codigo abaixo
my @str=split(' ', $_);
for($i = 0; $i < scalar(@str)-3; $i++) {
print "$str[$i] ";
}
mas como o arquivo de texto original tem aproximadamente 6GB fica muito ruim usar esse for
pois estou demorando quase 3 horas para processar o arquivo.
Por isso que gostaria de aprender a fazer o split no espaço especifico e otimizar o processo.
Desde já muito obrigado.
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.