Manipulando strings

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.

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.

[code]
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);

}[/code]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

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.
[ ]

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

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.

[quote=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.
[ ]

[/quote]

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

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

[quote=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[/quote]

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

Abração,
André AS.

[quote=andredecotia]
cafezin, não entendí o que você quer fazer…

Como assim pegar o comentário do campo!? Pode ser mais claro?[/quote]

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

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.

[code]Objeto1
campo1, !- comentario1 Obj1
campo2; !- comentario2 Obj1

Objeto2
campo1, !- comentario1 Obj2
campo2, !- comentario2 Obj2
campo3, !- comentario3 Obj2
campo4, !- comentario4 Obj2
campo5; !- comentario5 Obj2
[/code]

E desenvolvi para (teste) este código aqui. Logo se for isto, vamos pensar em uma forma de melhorar isto.

[code]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();
}

}
[/code]Tive como saida isto aqui:

[code]Objeto1

  • campo1
  • comentario1 Obj1
  • campo2
  • comentario2 Obj1
    Objeto2
  • campo1
  • comentario1 Obj2
  • campo2
  • comentario2 Obj2
  • campo3
  • comentario3 Obj2
  • campo4
  • comentario4 Obj2
  • campo5
  • comentario5 Obj2
    [/code]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

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:

[code]Objeto

  • nome: String
  • campos: List
    gettter n setters

Campo

  • valor: String
  • comentario: String
    gettter n setters[/code]
    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.

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

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

Um Abraço

[quote=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[/quote]

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

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

Solução final (eu acho)

[code]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();
}

}[/code]

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

[quote=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
[/quote]
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

[ ]