Duvida com a String split [Resolvido]

30 respostas
U

Olá pessoal.

Estou com uma aquivo .txt de uma tabela e o espaço entre os dados é grande.

veja como é:

00001…10:49:57…17/9/2010…-25,7
00002…10:50:00…17/9/2010…-25,7
00003…10:50:03…17/9/2010…-25,7
00004…10:50:06…17/9/2010…-25,7
00005…10:50:09…17/9/2010…-25,7

Obs: no lugar dos .(pontos) é um espaço(" "), como sou novo aqui não achei um melhor jeito de deixar os espaços, o proprio forúm apaga os espaços deixando apenas um.

Como faço a separação para grandes espaços?

se alguem poder me ajudar fico agradecido.

30 Respostas

P

Sua ideia seria dar um split através dos espaços? colocar tipo em um array assim? {00001,10:49:57,17/9/2010,-25,7}

U

isso mesmo

guilhermehkr

Se a quantidade de espaços entre cada valor for fixa, você pode passar isso como regex pro método split.

vide código de exemplo:

String[] array = "00001     10:49:57     17/9/2010     -25,7".split("     ");
for(String string : array) {
    System.out.println(string);
}

abraços.

U

guilhermehkr

ai que esta o problema, o espaço entre cada valor não é fixo.

no caso a String seria assim:

String valor = "00001          10:49:57    17/9/2010   -25,7";

com tamanho de espaço diferente entre cada valor.

D

ulysses:
guilhermehkr

ai que esta o problema, o espaço entre cada valor não é fixo.

no caso a String seria assim:

String valor = "00001          10:49:57    17/9/2010   -25,7";

com tamanho de espaço diferente entre cada valor.

Olá,

Tenta dar um replace primeiro, tipo assim:

String valor = "00001 10:49:57 17/9/2010 -25,7"; valor.replaceAll(" ","|");//essa barra | é para facilitar o split valor.split("|");

Cara, não testei esse código mas acho que dá certo!
Tenta aí e depois posta o resultado ok?
Espero ter ajudado!
Abraços;
Daniel…

jaboot

Meu, usem o apache-commons (StringUtils)… tem várias coisas prontas.

Uma pergunta: esses dados no txt vem sempre na mesma posição? Se sim, facilita a sua vida demais.

guilhermehkr

Sendo assim, imagino que você não poderá usar split, afinal ele se baseia em uma regex para separar a string - me corrijam se estiver falando besteira.

Até onde vai meu conhecimento em String, que é pouco, diria que você terá que fazer na mão.

denisspitfire

vamos fazer uma gambiarra…
se de caracter em caracter voce achar o primeiro espaço voce substitui ele por um “;” depois até voce achar um caracter diferente de " " elimine o caracter. fique nesse loop até terminar a string

jaboot

Se for posições fixas, ele pega a linha inteira e dá um substring no que precisar.

guilhermehkr

O que o jaboot disse é verdade.

Utilizar o ApacheUtils é muito bom!
Utilizando o replace, você consegue colocar um outro delimitador de palavra em cada bloco de espaço.

Por exemplo: Se na primeira coluna você tem 4 espaços em branco e na segunda 3 espaços e sempre for assim em todas as linhas, você pode dar dois replaces!

U

Daniel Hideki:

Olá,

Tenta dar um replace primeiro, tipo assim:

String valor = "00001 10:49:57 17/9/2010 -25,7"; valor.replaceAll(" ","|");//essa barra | é para facilitar o split valor.split("|");

Cara, não testei esse código mas acho que dá certo!
Tenta aí e depois posta o resultado ok?
Espero ter ajudado!
Abraços;
Daniel…

testei aqui, apenas substitui os espaços por “|” , deu na mesma.

jaboot:

Meu, usem o apache-commons (StringUtils)… tem várias coisas prontas.

Uma pergunta: esses dados no txt vem sempre na mesma posição? Se sim, facilita a sua vida demais.

sim, ele vem sempre na mesma posição, existe algum outro metodo que posso usar sem ser o split??

U

denisspitfire:
vamos fazer uma gambiarra…
se de caracter em caracter voce achar o primeiro espaço voce substitui ele por um “;” depois até voce achar um caracter diferente de " " elimine o caracter. fique nesse loop até terminar a string

mais ai não pesa a aplicação? pois ela é muito grande, essa parti é apenas um pequeno pedaço dela.
mas a sua logica foi boa, posso tentar essa solução se não achar um metodo mais simples.

U

guilhermehkr:
O que o jaboot disse é verdade.

Utilizar o ApacheUtils é muito bom!
Utilizando o replace, você consegue colocar um outro delimitador de palavra em cada bloco de espaço.

Por exemplo: Se na primeira coluna você tem 4 espaços em branco e na segunda 3 espaços e sempre for assim em todas as linhas, você pode dar dois replaces!

não sei muito a respeito do ApacheUtils,
tem algum livro ou artigo que possa me indicar?

denisspitfire

ulysses:
denisspitfire:
vamos fazer uma gambiarra…
se de caracter em caracter voce achar o primeiro espaço voce substitui ele por um “;” depois até voce achar um caracter diferente de " " elimine o caracter. fique nesse loop até terminar a string

mais ai não pesa a aplicação? pois ela é muito grande, essa parti é apenas um pequeno pedaço dela.
mas a sua logica foi boa, posso tentar essa solução se não achar um metodo mais simples.

De qualquer forma o split vai fazer exatamente isso… talvez tenha um algoritmo mais rapido, porém, quando o prazo de entrega aperta… vai na POG mesmo

nel

Oi,

faça assim:

String[] array = linha.split("[ ]");

Abraços.

mapleplayer

Olá.

Primeiramente gostaria de dizer obrigado por me fornecer este desafio nesta manhã de quarta-feira.
A primeira vista achei que seria simples mas deu um trabalho legal de resolver.

Fiz usando regex para seus dados ficarem simples para fazer um split como todos sugerem.
Meu código ficou assim.

// Representa os dados no seu arquivo
        String dados = "00001          10:49:57    17/9/2010   -25,7\n" +
        "00002          10:50:00    17/9/2010   -25,7\n" +
        "00003          10:50:03    17/9/2010   -25,7\n" +
        "00004          10:50:06    17/9/2010   -25,7\n" +
        "00005          10:50:09    17/9/2010   -25,7";
        try {
            Pattern p = Pattern.compile("\\s{2,}"); // quero procurar por dois ou mais espacos em branco na String
            Matcher m = p.matcher(dados);
            System.out.println(dados); // Exibe como esta a String atualmente
            System.out.println();
            dados = m.replaceAll(" "); 
            // Acima substituo todas Strings que sao iguais ao que defini no regex por apenas um espaco em branco
            System.out.println(dados); // Exibe seus dados apos a alteracao
           // TODO Fazer o split dos dados usando o espaco em branco como separador
        } catch (Exception e) {
            e.printStackTrace();
        }

Para testar nao esqueca de fazer os imports corretos.

guilhermehkr

ulysses:
guilhermehkr:
O que o jaboot disse é verdade.

Utilizar o ApacheUtils é muito bom!
Utilizando o replace, você consegue colocar um outro delimitador de palavra em cada bloco de espaço.

Por exemplo: Se na primeira coluna você tem 4 espaços em branco e na segunda 3 espaços e sempre for assim em todas as linhas, você pode dar dois replaces!

não sei muito a respeito do ApacheUtils,
tem algum livro ou artigo que possa me indicar?

Então, aqui tem uma explicação básica de cada método: http://www.apacheadmins.com/2011/06/java-tutorialapache-commonstringutils-java/

ulysses, cada coluna tem uma quantidade de espaço diferente, porém quando muda de linha esta quantidade de espaço se mantém a mesma para cada coluna!?
Se você tiver pelo menos esta padrão, você pode fazer na mão com replaces!

guilhermehkr

Parabéns mapleplayer, realmente esta solução ficou muito boa.
Testei aqui e irei guardar a solução!

Espero que ajude o relator do tópico.

Abraços.

B

Senhores, o String.split recebe uma RegEx, não um caracter.

Se quiser que ele separa por vários espaços ou outros caracteres em branco:

String linha = "00001          10:49:57    17/9/2010   -25,7";

String[] separados = linha.split("\\s+");

Aliás, é uma boa hora para começar a aprender Regular Expressions, vocês vão utilizá-la em quaisquer transformações envolvendo Strings, pelo resto da sua vida. Recomendo os livros do Piazinho.

U

mapleplayer muito obrigado funcionou perfeitamente :smiley: esta de parabéns cara.

essa sua solução vai ajudar muitos :smiley:

guilhermehkr
vlw pela ajuda tbm :smiley:

Abraços.

U
Bruno Laturner:
Senhores, o String.split recebe uma RegEx, não um caracter. Se quiser que ele separa por vários espaços ou outros caracteres em branco:
String linha = "00001          10:49:57    17/9/2010   -25,7";

String[] separados = linha.split("\\s+");
Aliás, é uma boa hora para começar a aprender Regular Expressions, vocês vão utilizá-la em quaisquer transformações envolvendo Strings, pelo resto da sua vida. Recomendo os livros do Piazinho.

Bruno o seu tbm funcionou perfeitamente muito obrigado :D

só acrescentei o systemout no final para fazer teste

String linha = "00001          10:49:57    17/9/2010   -25,7";

String[] separados = linha.split("\\s+");
System.out.println(separados[0]);
denisspitfire

é… resolveu em duas linhas kkkk
parabens cara

mapleplayer

Obrigado.

Muito bem Bruno.
Tinha me esquecido deste detalhe(recebe uma regex) do método split da classe String.

Para estudar regex eu recomendo o proprio site da oracle sobre regex
http://docs.oracle.com/javase/tutorial/essential/regex/index.html

Vingdel

ulysses, boa tarde!

É mais simples do que você pode imaginar, veja:

... String minhaString = "aaa aa a"; System.out.println("minhaString sem espaços: " + minhaString.replaceAll("\\s{1,}",",")); ...Saída:

minhaString sem espaços: aaa,aa,a
É isso que você quer, né?

Abraço!

Lucas_Abbatepaolo

Cara…deu ate medo algumas ideias que postaram aqui…

creio que este seja o ideal…na MINHA OPINIÂO semanticamente mais simples e facil de entende…

String[] separados = linha.split("\\s+");

se ja foi solucionado coloque como [RESOLVIDO]
[]'s

guilhermehkr

Qual é o problema Lucas?!
Ta com medo do que?!

Cara, se a gente deu ideias furadas, é porque não sabemos, e se não sabemos estamos aqui para aprender mano.
Se você se acha top, respondesse você, mas como não tinha ninguem tão “fod4” como você, tentamos ajudar da forma que pudemos!

Se liga maluco, se ponha no seu lugar.
Mantenha a pouca humildade que lhe resta!

R

Lucas Abbatepaolo:
Cara…deu ate medo algumas ideias que postaram aqui…

creio que este seja o ideal…na MINHA OPINIÂO semanticamente mais simples e facil de entende…

String[] separados = linha.split("\\s+");

se ja foi solucionado coloque como [RESOLVIDO]
[]'s

Quanta deselegancia em amigo.

Na sua assinatura também faltou colocar “Rumo a humildade”.

abs,

Lucas_Abbatepaolo

Pq…so pq comentei q deu medo???rs

foi so uma brincadeira …não fica bravo…

é que muita gente procura soluções por aqui…e muitos não buscam a melhor solução …então alguem que entra aqui meio nas pressas e pega a primeira dica que ve acredita que esta fazendo o certo e as vezes não é a melhor opção…
por isso EU evito de dar dicas e ideias mirabolantes e costumo RECOMENDAR que façam o mesmo…

depois vou arrumar a assinatura…pode deixar…

[]'s

U

prontinho já coloquei resolvido.

Lucas Abbatepaolo
realmente muita gente só olha a primeira página achando que lá esta a melhor solução

garanto que aqui muita gente aprendeu alguma coisa, estamos aqui é para isso aprender mais
buscar mais conhececimento e nos ajudar uns aos outros.

Muito obrigado a todos pela ajuda.

Abraços.

Lucas_Abbatepaolo

guilhermehkr:
Qual é o problema Lucas?!
Ta com medo do que?!

Cara, se a gente deu ideias furadas, é porque não sabemos, e se não sabemos estamos aqui para aprender mano.
Se você se acha top, respondesse você, mas como não tinha ninguem tão “fod4” como você, tentamos ajudar da forma que pudemos!

Se liga maluco, se ponha no seu lugar.
Mantenha a pouca humildade que lhe resta!

Se liga vc “maluco”… não me gabei em nenhum momento e não sei pq vc ficou todo magoado ai…

É por causa de pessoas como vc que os q ja tem uma certeza experiencia optão por não responder questões mais simples … pelo simples motivo de que quando damos a opnião, frustados como vc vem cheio de dar lição de moral sobre humildade…

[]'s

Criado 4 de janeiro de 2012
Ultima resposta 5 de jan. de 2012
Respostas 30
Participantes 12