Ir para conteúdo
Fórum Script Brasil
  • 0

Fazer split em espaço especifico de uma string.


Pablo de Sa

Pergunta

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

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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: qq71A.png
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 por Fvox
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...