Manipulando strings

16 respostas
cafezin

Dae pessoal,

Tenho um arquivo com seguinte esqueleto[i]
Objeto1,
campo1, !- comentario
campo2; !- comentario

Objeto2,
campo1, !- comentario
campo2, !- comentario
campo3, !- comentario
campo4, !- comentario
campo5; !- comentario

Objeto3,
campo1, !- comentario
campo2, !- comentario
campo3, !- comentario [/i]

Bom, o que eu gostaria era conseguir extrair estes objetos com seus campos e respectivos comentarios(eles variam em numero de campos). Montar os objetos é tranquilo, estou com dificuldade em manipular estas strings
A minha idéia era ler linha a linha e em seguida montar um split com regex de virgula, exclamacao e traço, ponto e virgula. Mas estou com dificuldades de montar o REGEX completo.

Se alguém tiver uma idéia ou puder me ajudar com o regex do split, eu ficaria grato.

16 Respostas

A

cafezin,

Na sua propria pergunta você citou a solução, é apenas colocar um split(";"); Não entendi de fato aonde está o problema, mas segue abaixo um exemplo que fiz.. veja se é isto.
public static void main(String[] args) {
	String str = "campo1;campo2;campo3;campo4;!-comentario";
		
	String[] objDados = str.split(";");
	for (String dado: objDados)
		System.out.println(dado);
}
Outro detalhe, você vai precisar criar de um controle para as linhas que é "Objeto1", "Objeto2", pois no exemplo acima, so é tratado a linha de "dados".

Att

cafezin

Então…
Pegando como exemplo o objeto 1.

Objeto1,
campo1; !- comentario
campo2; !- comentario

ficaria dessa forma:
[i]Objeto1,campo1; !- comentariocampo2; !- comentario [i]

Eu preciso separar:
“Objeto1”
e seus campos com comentarios:
“campo1” “comentario1”
“campo2” “comentario2”
Imagino que são vários tratamentos manipulando a strings(blz… vamos quebrar a cabeça). Mas queria saber se dá pra botar um regex que consigo fazer essas separacoes.

Vou pensando aqui, e se der certo boto a solução na unha.
[ ]

A

Veja são multiplos comentários também?

Não entendi como vai vim este arquivo, tudo em uma linha os campos e os comentarios, ou cada um em uma linha…
Poste um exemplo real disto

Att

cafezin

O exemplo real é identico ao do primeiro post. Talvez o que nao tenha ficado claro é que cada campo tem um comentario próprio.

Objeto1,
campo1, !-comentarioDoCampo1
campo2, !-comentarioDoCampo2
campo3; !-comentarioDoCampo3

Observações:
o número de campos varia para cada objeto.
no último campo tem um “;” porém não termina pois ainda é preciso ler o comentário respectivo ao último campo.

A

cafezin:
Então…
Pegando como exemplo o objeto 1.

Objeto1,
campo1; !- comentario
campo2; !- comentario

ficaria dessa forma:
[i]Objeto1,campo1; !- comentariocampo2; !- comentario [i]

Eu preciso separar:
“Objeto1”
e seus campos com comentarios:
“campo1” “comentario1”
“campo2” “comentario2”
Imagino que são vários tratamentos manipulando a strings(blz… vamos quebrar a cabeça). Mas queria saber se dá pra botar um regex que consigo fazer essas separacoes.

Vou pensando aqui, e se der certo boto a solução na unha.
[ ]

cafezin, não entendí o que você quer fazer…

Como assim pegar o comentário do campo!? Pode ser mais claro?

A

Astork:
Veja são multiplos comentários também?

Não entendi como vai vim este arquivo, tudo em uma linha os campos e os comentarios, ou cada um em uma linha…
Poste um exemplo real disto

Att

Esse cara é o cara! Eai brother quanto tempo rs… E o inglês?

Abração,
André AS.

cafezin

andredecotia:

cafezin, não entendí o que você quer fazer…

Como assim pegar o comentário do campo!? Pode ser mais claro?

Realmente não sei como ser mais claro.
O arquivo vai vir assim:

Pessoa,
nome; !- Aqui deve ser colocado o nome
idade; !- Aqui deve ser colocada a idade

no caso eu quero pegar:
Pessoa
nome
Aqui deve ser colocado o nome
idade
Aqui deve ser colocada a idade

A

cafezin
Ainda vou conseguir te ajudar..rsss

Fiz um código aqui com o que eu entendi que você quer fazer... !!!!
Criei um arquivo com este txt.

Objeto1
campo1, !- comentario1 Obj1
campo2; !- comentario2 Obj1

Objeto2
campo1, !- comentario1 Obj2
campo2, !- comentario2 Obj2
campo3, !- comentario3 Obj2
campo4, !- comentario4 Obj2
campo5; !- comentario5 Obj2
E desenvolvi para (teste) este código aqui. Logo se for isto, vamos pensar em uma forma de melhorar isto.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Pattern;

public class Principal {
	public static void main(String[] args) throws FileNotFoundException {

		Scanner sc = new Scanner(new File("C:/objeto.txt"));
		String linha;
		while (sc.hasNextLine()) {
			linha = sc.nextLine();
			if (isObjeto(linha)) 
				System.out.println(linha);
			else if (isCampo(linha)) {
				System.out.println("  - " + obterNome(linha));
				System.out.println("  - " + obterComentario(linha));
			}
		}
	}
	
	
	private static boolean isObjeto(String linha) {
		return Pattern.compile("Objeto[0-9]+").matcher(linha).find();
	}
	
	private static boolean isCampo(String linha) {
		if (linha.trim().equals(""))
			return false;
		return linha.split(";").length > 0;
	}
	
	private static String obterNome(String linha) {
		return linha.split("!-")[0].replaceAll(",", "").replaceAll(";", "").trim();
	}
	
	private static String obterComentario(String linha) {
		return linha.split("!-")[1].trim();
	}
}
Tive como saida isto aqui:
Objeto1
  - campo1
  - comentario1 Obj1
  - campo2
  - comentario2 Obj1
Objeto2
  - campo1
  - comentario1 Obj2
  - campo2
  - comentario2 Obj2
  - campo3
  - comentario3 Obj2
  - campo4
  - comentario4 Obj2
  - campo5
  - comentario5 Obj2
Por favor verifique se é isto que precisa... !! caso não seja... eu tenho algumas questões sobre sua dúvida.

Depois que você pegar estes dados vai jogar para algum objeto? o que vai fazer com isto?
Pode vim mais de um comentário ou campo na mesma linha? Assim campo1, campo2 !- comentario1, comentario2 (Pelo que eu entendi não pode).

Mas a principio valide isto que te enviei e no final vamos nos acertando referente sua dúvida e a solução para seu problema.

Att

cafezin

kra.. te devo uma cerveja.

Não testei ainda, mas se sua saída foi isso, está correto.
Só faltou um detalhe no seu arquivo.
Em Objeto1 e Objeto2 contém virgula no final.
Ex:
Objeto1,
Objeto2,

Sobre suas perguntas.. Sim, vou popular um objeto que possui nome e campos. Pode ser algo do tipo:
Objeto
- nome: String
- campos: List<Campo>
gettter n setters

Campo
- valor: String
- comentario: String
gettter n setters
E sobre a outra pergunta, é isso mesmo vc entendeu correto. Não pode mais de um campo ou comentario em uma linha.

Grande abraço e muito obrigado.

A

cafezin,

Legal que conseguimos chegarmos na solução. Referente pegar a virgula é so mudar a expressão regular “Objeto[0-9]+” para isto por exemplo “Objeto.*”

Só mais um detalhe, o código que eu coloquei tem bastante coisa que precisa ser mudada e melhorada… por exemplo os métodos são estáticos e não tem utilidade nenhuma eles serem estáticos, só fiz para facilitar o exemplo.

Neste caso é interessante dar uma melhorada no código e apenas utilizar a idéia.

Att

cafezin

Está certo.
Quando eu terminar faço um novo post.
Agradeço o esforço novamente.

Um Abraço

cafezin

Astork:
cafezin,

Legal que conseguimos chegarmos na solução. Referente pegar a virgula é so mudar a expressão regular “Objeto[0-9]+” para isto por exemplo “Objeto.*”

Só mais um detalhe, o código que eu coloquei tem bastante coisa que precisa ser mudada e melhorada… por exemplo os métodos são estáticos e não tem utilidade nenhuma eles serem estáticos, só fiz para facilitar o exemplo.

Neste caso é interessante dar uma melhorada no código e apenas utilizar a idéia.

Att

Ah faltou um detalhe…
Os objetos não terão nomes de Objeto, eles podem assumir qualquer nome.
Como no exemplo do post que coloquei lá atrás
[i]Pessoa,
nome; !- Campo para se colocar o nome(isso é um comentario)
idade; !- Campo para se colocar a idade

Livro,
nome; !- comentario sobre o campo nome
capaDura; !- comentario sobre o campo capaDura[/i]

Portanto o Pattern Objeto[0-9] nao rola. Teria de ser qualquer String.
Uma maneira que pensei foi pegar sempre o que vem após a uma linha toda vazia.

Enfim, só compartilhando o problema.
Abraço

A

Sim neste caso como não tem padrão de nome, não tem como identificar quando é objeto ou não…

Você poderia usar alguma alternativa

  • Depois da linha vazia (assim como você mesmo sugeriu)
  • Alterar a escrita do objeto para colocar algum caracter que identifique uma linha de objeto, algo como ###Objeto, ###Pessoa, etc.
  • Procurar uma linha que não tem “;” e nem “,” pois todos os campos tem estes caracteres.

Att

cafezin

Solução final (eu acho)

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Populator {

	public void populator() throws FileNotFoundException {
		Scanner sc = new Scanner(new File("files/esqueleto"));
		String linha;
		// pega a primeira, pois nao tem nada em branco antes.
		System.out.println(sc.nextLine());
		while (sc.hasNextLine()) {
			linha = sc.nextLine();
			if (isEmBranco(linha))
				System.out.println(sc.nextLine().replace(",", ""));
			else if (isCampo(linha)) {
				System.out.println("  - " + obterNome(linha));
				System.out.println("  - " + obterComentario(linha));
			}
		}
	}

	private boolean isEmBranco(String linha) {
		if (linha.length() < 1)
			return true;
		return false;
	}

	private boolean isCampo(String linha) {
		if (linha.trim().equals(""))
			return false;
		return linha.split(";").length > 0;
	}

	private String obterNome(String linha) {
		return linha.split("!-")[0].replaceAll(",", "").replaceAll(";", "")
				.trim();
	}

	private String obterComentario(String linha) {
		return linha.split("!-")[1].trim();
	}
}
cafezin

na verdade o metodo em branco ficou meio a toa… nao precisava dele… mas ta bom… da pra entender bem a idéia

cafezin

Astork:
Sim neste caso como não tem padrão de nome, não tem como identificar quando é objeto ou não…

Você poderia usar alguma alternativa

  • Depois da linha vazia (assim como você mesmo sugeriu)
  • Alterar a escrita do objeto para colocar algum caracter que identifique uma linha de objeto, algo como ###Objeto, ###Pessoa, etc.
  • Procurar uma linha que não tem “;” e nem “,” pois todos os campos tem estes caracteres.

Att


Depois da linha vazia, foi a melhor opção. Nao posso alterar a escrita e os “Objeto” também possuem virgula.
Massa, vai ser útil aqui

[ ]

Criado 7 de abril de 2011
Ultima resposta 8 de abr. de 2011
Respostas 16
Participantes 3