Tratar Array capo com data

Bom dia pessoal,

Já tentei varias coisas e ainda não consegui resolver. Não sei o que estou fazendo de errado ou se falta algo podem me ajudar?

Faço a leitura de um txt até isso não da problema nenhum. Porem existem alguns campos que a informação são datas no seguinte formato 2015-07-15 15:45:00, o que acontece preciso fazer isso ficar no formato 15/07/2015 15:45:00. Meu condigo de leitura do arquivo e o que tentei até aqui.

Leitura do arquivo:

public class CopyPendentes extends Conexao {

	public static void main(String[] args) throws IOException, Exception  {
		
		Connection conn = ObterConexao();
		
		
				
		FileReader arq = new FileReader ("C:/Desktop/Bases/Bases chamados/Chamados.txt");
		BufferedReader sr = new BufferedReader (arq);
		String[] adados = new String [54];
		String[] adados1 = new String [54];
		String dados = null;
		
		sr.readLine();
		
		while ((dados = sr.readLine().replaceAll("\"", "")) != null) {
			adados = dados.replaceAll("'", "").split(",");

Minhas tentativas são um pouco banais mas foi o que consegui pensar na hora. Dessa maneira sem da algum erro quando tenho algum campo data nulo,
Tentativas:


try { 
							if (adados[48] != null){
								adados[48]=adados[48].substring(8,10)+"/"+adados[48].substring(5,7)+"/"+adados[48].substring(0,4);}
							else{
								adados[48] = adados[48]; 
							}}
							  catch (java.lang.StringIndexOutOfBoundsException e) {  
								 adados[48] = adados[48];  
							 }
						      catch (java.lang.NullPointerException e) {  
							 adados[48] = adados[48];  
						      };

Você pode trabalhar com regular expressions para fazer isso.

Mas a pergunta mesmo é: você quer usar essa data como String ou em algum momento vai convertê-la para algum objeto que represente data (Date, Calendar ou DateTime)??

Exemplo com regex:

	public static void main(String[] args) {
		String a = "2015-07-15 15:45:00";
		
		String b = a.replaceAll("^(\\d{4})-(\\d{2})-(\\d{2})\\s([\\d|\\:]+)$", "$3/$2/$1 $4");
		
		System.out.println(b);
	}

Se você quiser entender o que esse código faz, me fale que eu te explico.

[quote=Rafael Guerreiro]Você pode trabalhar com regular expressions para fazer isso.

Mas a pergunta mesmo é: você quer usar essa data como String ou em algum momento vai convertê-la para algum objeto que represente data (Date, Calendar ou DateTime)??

Exemplo com regex:

	public static void main(String[] args) {
		String a = "2015-07-15 15:45:00";
		
		String b = a.replaceAll("^(\\d{4})-(\\d{2})-(\\d{2})\\s([\\d|\\:]+)$", "$3/$2/$1 $4");
		
		System.out.println(b);
	}

Se você quiser entender o que esse código faz, me fale que eu te explico.[/quote]

Rafael obrigado por responder. Quero sim meu amigo pois de todos os exemplos que vi nos livros e na internet não tinha visto nada como este.

Ponto 1 - sua explicação sobre seu código.

Ponto 2 - seu código é melhor de fato mas tinha conseguido fazer também com o modo neandertal que fiz rsrsrsr. Mas o seu é melhor.

Ponto 3 - meu maior problema é este:

Exception in thread "main" java.lang.NullPointerException
	at Carga.Pendentes.main(Pendentes.java:23)

Ponto 4 - Como a carga deste banco eu passo para um array string acho que terei que passar para data e regularizar a tabela do banco para data time.

O que acha? Se puder continuar me ajudando.

Obrigado!

Certo, então vamos lá!

Vamos aos seus pontos primeiro:

Ponto 1 - Regular expressions (regex ou regexp para os mais íntimos) são, como o nome diz, expressões regulares. Basicamente, dentro de uma String que segue um certo padrão, você consegue montar uma expressão que seja compatível com o padrão dessa String.

Vou tentar te explicar usando o exemplo que você me mandou:
Temos a primeira String “2015-07-15 15:45:00”. Ela segue um padrão bem definido, em ordem:

00 - Início da String;
01 - 4 dígitos do ano;
02 - 1 traço;
03 - 2 dígitos do mês;
04 - 1 traço;
05 - 2 dígitos do dia;
06 - 1 espaço;
07 - 2 dígitos da hora;
08 - 1 dois pontos ( : );
09 - 2 dígitos do minuto;
10 - 1 dois pontos ( : );
11 - 2 dígitos do segundo;
12 - Final da String.

Então, vamos converter cada item desses em um valor referente à expressão regular:
00 - “^” - Esse sinal significa “início da String”. Serve para você garantir que não vai ficar nada faltando.
01 - “\d{4}” - O \d serve para dizer que queremos apenas números (d de dígito). Como no java, para escrevermos uma barra invertida, precisamos colocar outra barra invertida antes (igual é feito com o " ou o \n), o \d no java fica “\d”. Depois temos 2 chaves com um número no meio, o número nos indica QUANTOS dígitos nós queremos. Nosso ano tem 4 dígitos.
02 - “-” - O traço pode ser ele mesmo.
03 - “\d{2}” - A mesma explicação do ano serve aqui.
04 - “-” - O traço pode ser ele mesmo.
05 - “\d{2}” - A mesma explicação do ano serve aqui.
06 - “\s” - O \s significa que queremos um espaço (s de space).
07 - “\d{2}” - A mesma explicação do ano serve aqui.
08 - “:” - O dois pontos pode ser ele mesmo.
09 - “\d{2}” - A mesma explicação do ano serve aqui.
10 - “:” - O dois pontos pode ser ele mesmo.
11 - “\d{2}” - A mesma explicação do ano serve aqui.
12 - “$” - Esse sinal significa “Final da String”. Serve para você garantir que não vai ficar nada faltando.

Então, colocando todos eles juntos, na mesma String, temos isso aqui:

String pattern = "^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}$"; // Não é igual à que eu te mandei, mas também serve.

No regex que eu fiz, eu coloquei uns parêntesis, isso é por quê eu queria agrupar os dígitos.

Bom, se eu fosse fazer um tutorial completo sobre regexp, ficaríamos aqui até o ano que vem, então vou colocar uns links super úteis:
http://rubular.com/ Rubular, um site para você testar regular expressions em Ruby. É bem útil pois você consegue testá-las rapidamente.
http://regexone.com/ RegexOne, um site que tem uma sequência de lições para você aprender regex. Eu recomendo fortemente.

http://regex.learncodethehardway.org/book/ “Learn Regex The Hard Way” - Bom, como o nome diz, aqui é BEM mais aprofundado em regexp. Vale a pena usar como referência.

Vou responder os outros pontos subsequentemente.

Continuando.

Ponto 2 - O importante é entender que código é subjetivo. Existem códigos mais rápidos e mais lentos. Códigos melhores de serem mantidos (é mais fácil de alterá-lo) e código mais difícil de serem alterados.

As vezes a regex não é a melhor solução pelo simples fato de ela ficar muito complexa. Imagina você trabalhando com mais 3 programadores e ai você me coloca uma regexp gigântica (por exemplo a de validação de e-mail, pesquise no google). Um belo de um dia, você está de férias e esses 3 programadores precisam mexer justamente naquele código que você fez. Você precisa detestá-los para fazer isso com eles hahahaha.

Ponto 3 - Toda vez que você ver um NullPointerException, a culpa vai ser SUA. Sempre sua. Sempre.
Vamos então entender o NullPointerException:

Quando temos uma variável como a seguinte:

String nome = "Rafael Guerreiro";

A variável NÃO está guardando um valor e NEM um objeto. Então o que ela está guardando? Uma referência.
A referência é, na verdade, AONDE o seu objeto está localizado na sua memória RAM. Então se fizermos o seguinte:

String nome = "Rafael Guerreiro";
String outroNome = nome;

Quantas variáveis temos? 2.
Quantas referências temos? 1.
Quantos objetos temos? 1.

Basicamente, existem 2 variáveis apontando para o mesmo endereço de memória. Endereço de memória é aonde está o seu objeto na sua memória RAM.

Agora, como que faço para ter uma variável que não aponta para endereço nenhum? Basta atribuir null à ela.

String nome = "Rafael Guerreiro";
String outroNome = null;

Quantas variáveis temos? 2.
Quantas referências temos? 1.
Quantos objetos temos? 1.

A diferença aqui é que uma dessas variáveis não aponta para referência alguma.

Então vamos entender os comportamentos de um objeto (métodos). Comportamento é o que o Objeto faz, logo, são os métodos.
Olhando a classe String, ela define que toda String sabe retornar o próprio tamanho, usando o método length().

String nome = "Rafael Guerreiro";
String outroNome = nome;

System.out.println(nome.length()); // 16
System.out.println(outroNome.length()); // Também é 16 pois o Objeto é o mesmo.

O que está acontecendo quando chamamos (invocamos) um método? O ponto (.) define o acesso ao Objeto referenciado pela variável. Basicamente, o programa vai até a memória RAM e procura o objeto para então pedir que ele execute o método solicitado, no caso, o length().

Agora, se uma das váriáveis está null, ou seja, não tem referência para um objeto, como que o nosso programa vai saber qual objeto deve executar aquele método? Ele não tem como saber. Simplesmente por quê não existe nenhum objeto para isso.

Daí ele dispara (throw) um NullPointerException. É uma exceção, algo de inesperado ocorreu no seu programa.

No exemplo que você me mandou:

Exception in thread "main" java.lang.NullPointerException at Carga.Pendentes.main(Pendentes.java:23)
Ele está te dizendo: “Na linha 23 da Classe Pendentes, você pediu que eu executasse um objeto, mas essa variável não referencia nenhum objeto.”

Como você resolve isso? Assim:

String aaa = null;

if (aaa != null) // Caso essa variável NÃO seja null, caso ela TENHA uma referência a um objeto.
	System.out.println(aaa.length());
else // Caso essa variável SEJA null
	System.out.println("aaa é null, não consigo saber o tamanho pois eu não tenho o objeto.");

DICA DE OURO
As exceptions, apesar de grandes e assustadoras, estão aqui para nos ajudar. Toda vez que você se deparar com uma, respire fundo e LEIA-A, ENTENDA-A e então corrija seu programa. É para isso que elas servem, para te contar o que deu de errado. Elas só são um pouco feias, mas não tem problema, tente ler mesmo assim. Esforce-se para descobrir por quê aquele erro ocorreu.

http://blog.caelum.com.br/lidando-com-exceptions/ Post no blog da Caelum sobre exceptions. É muito bom e importante.

Sobre o ponto 4, mais para frente tentamos resolvê-lo. Vamos cuidar do 1 e do 3 primeiro.

cara aprenda a transformar string para data e data para string, acho que fica mais fácil não?

[code]public static void main(String[] args) {
String dataQueRecebeuDoArquivo = “2015-07-15 15:45:00”;
SimpleDateFormat dataArquivo = new SimpleDateFormat(“yyyy-mm-dd HH:mm:ss”);
SimpleDateFormat dataCerta = new SimpleDateFormat(“dd/mm/yyyy HH:mm:ss”);

	try {
		Date stringToDate = dataArquivo.parse(dataQueRecebeuDoArquivo);
		System.out.println(stringToDate);
		String dataToString = dataCerta.format(stringToDate);
		System.out.println(dataToString);
		
	} catch (Exception e) {
		e.printStackTrace();
	}
}[/code]

[quote=Rafael Guerreiro][/quote]

Rafael, nem sei o que dizer. Cara sua paciência e prestatividade, me ajudaram de uma maneira sem tamanho. Não tenho palavras para agradecer um dia que um for pra São Paulo pago um almoço :D…

Muito obrigado!!!

[quote=eduJava][/quote]

Edu meu camarada obrigado também e valeu pelo alerta. Meu problema se dá pois muito executado da maneira que dava pela urgência da aplicação. Hoje estou acertando tudo e corrigindo muita coisa além de ter que colocar a mão no banco de dados agora. Bicho trampo dobrado sem ter tempo para fazer tudo.

Muito Obrigado pela ajuda

Abs!

A resposta do eduJava é realmente melhor para o seu caso, já que você deu a entender que quer usar Date.

Mas tente estudar Hibernate para fazer isso.

Existem alguns problemas no código que você colocou aqui, ele não está orientado a objetos, está procedural. O Java fica confuso quando programado de forma procedural.

Um exemplo disso é a sua classe CopyPendentes estender Conexao. Analisando o nome, CopyPendentes não me parece que ele vai fazer o que uma Conexao faz. Me parece que você fez isso só para ter acesso ao método estático ObterConexao().

Isso é um mal sinal.

Se você quiser, posso te ajudar a tornar esse código mais orientado a objetos.

[quote=Rafael Guerreiro]A resposta do eduJava é realmente melhor para o seu caso, já que você deu a entender que quer usar Date.

Mas tente estudar Hibernate para fazer isso.

Existem alguns problemas no código que você colocou aqui, ele não está orientado a objetos, está procedural. O Java fica confuso quando programado de forma procedural.

Um exemplo disso é a sua classe CopyPendentes estender Conexao. Analisando o nome, CopyPendentes não me parece que ele vai fazer o que uma Conexao faz. Me parece que você fez isso só para ter acesso ao método estático ObterConexao().

Isso é um mal sinal.

Se você quiser, posso te ajudar a tornar esse código mais orientado a objetos.[/quote]

Estou impressionado, por sua ajuda vou querer sim sua ajuda mas deixe me tentar ver meus erros primeiro e conseguir vê-los.
Eu nos últimos três anos trabalhei apenas com banco, mas na nova empresa estou como programador e tendo que resolver muito rápido as coisas.

Posso entrar em contato se tiver duvida?. Trocar ideia sobre código nunca tive essa oportunidade. As vezes conheço alguns métodos mas não sei usa-los direito.

Pode sim. Você pode criar uma pergunta aqui no Fórum ou lá no GUJ Respostas e me mandar um MP (mensagem privada) caso queira que eu analise o que você está perguntando.

Só não vai ser legal caso você pergunte as coisas diretamente por MP, pois quem tiver a mesma dúvida não irá conseguir encontrar uma resolução facilmente.

No mais, tenho uma dica boa, faça cursos de programação. Dê uma olhada no Alura.

Não, não sou vendedor/instrutor da Caelum, mas é que eles me ensinaram muitas coisas e eu acho válido indicar o serviço deles.