Jump to content
Fórum Script Brasil
  • 0

Fazer split em espaço especifico de uma string.


Pablo de Sa

Question

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 to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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

Edited by Fvox
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...