Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Liberdade

Ler e validar TXT

Recommended Posts

Pessoal, eu estou cansada de apanhar desse código.. Como até o momento eu não consegui fazer validação no XLS eu resolvi ir para o TXT.. mas consegui muito pouco. Alguém pode me ajudar?

 

Eu peguei esse exemplo e consegui ler o meu arquivo.

 

http://www.imasters.com.br/artigo/3869/asp...os_delimitados/

 

Segue o código..

 

<%@ Page Language="vb" Debug="true" %><%@ import Namespace="System.IO" %><script runat="server">	Sub page_load(Sender As Object,e As EventArgs)		 	 'define o local do arquivo	 Dim Arquivo as string = "c:\teste\ExcelData.txt"		 	'define um arquivo do tipo streamreader e abre o arquivo	 dim arquivoStream as StreamReader		 	 Dim delimitador as String = ","		 	 dim i as integer		 	 try		arquivoStream = File.Opentext(Arquivo)	 catch ex as Exception		lblerro.text = " Arquivo não encontrado."		exit sub	 end try		 	 Dim conteudo as String = arquivoStream.ReadToEnd()		 	 lbltexto.text = conteudo & "<br>"		 	 dim separar = Split(conteudo,delimitador)		 	 for i=0 to Ubound(separar)		  lblresultado.text &= i+1 & ") " & separar(i) & "<br>"		next		 	 arquivoStream.close()		 	End Sub</script><html><head></head><body>	<hr />	<font face="Trebuchet MS"><font color="blue"><strong>Arquivo Texto</strong> :</font></font>  <font face="Trebuchet MS">homero.txt</font>		 	<p>	</p>	<p>		<asp:Label id="lbltexto" runat="server" font-names="Verdana" font-name="Verdana" font-size="X-Small" font-italic="True"></asp:Label>	</p>	<hr />	<font face="Trebuchet MS"><font color="#ff8040"><strong>Resultado</strong> :</font></font>  <font face="Trebuchet MS" size="2">usando	delimitador igual a ","</font> 	<p>		<strong><em> </em></strong><asp:Label id="lblresultado" runat="server" font-names="Verdana" font-name="Verdana" font-size="X-Small"></asp:Label><em> </em>	</p>	<em>		 	<hr />	</em>   	<asp:Label id="lblerro" runat="server" forecolor="Red" font-names="Trebuchet MS" font-bold="True"></asp:Label>  <br /></body></html>

O arquivo está separado por vírgula como está no cógigo.. Agora a questão é:

Quando eu peço para listar ele faz um loop e varre o arquivo e em cada delimitador ele criar um número como no exemplo.. o meu arquivo foi de 01 até 59, existe um valor no número 44 valor esse que é 001 (como verificar se no arquivo existe somente esse cara?) e depois que eu conseguir verificar esse cara eu terei que verificar se a posição 59 47 e mais algumas são datas válidas. ddmmaaaa. alguém tem alguma idéia?

 

Pessoal eu consegui fazendo assim..

 

dim separar = Split(conteudo,delimitador)	lblresultado.text = separar(13)	if separar(13) =  0001 then	response.write("é igual")	else	response.write("é diferente de 0001")	end if arquivoStream.close()End Sub
Agora vem a pior parte (eu acho), existem algumas datas e preciso validar, mas como?

 

Sobre a data eu tentei assim..

 

dim separar = Split(conteudo,delimitador)	lblresultado.text = separar(35) dim data = CDate(separar(35))	if IsDate(data) then	response.write("data válida")	else	response.write("data inválida")	end if arquivoStream.close()End Sub
Olhem o erro que está dando..

Conversion from string " 28101980" to type 'Date' is not valid.

Justamente nessa linha.

dim data = CDate(separar(35))

 

 

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhem o erro que está dando..Conversion from string " 28101980" to type 'Date' is not valid.Justamente nessa linha.dim data = CDate(separar(35))

"28101980" não é possível transformar em Data."28/10/1980" É.
dim data as String = (separar(35))data=Left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)dim DataConvertida as Date=cDate(data)
PS. Não testei o código, mas é por aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou assim..

dim separar = Split(conteudo,delimitador)	lblresultado.text = separar(35) dim data as String = (separar(35))	data=left(data,2)&"/"&mid(data,3,2)&"/"&right(data,4) dim DataConvertida as Date = CDate(data)	if IsDate(DataConvertida) then	response.write("data válida")	else	response.write("data inválida")	end if arquivoStream.close()End Sub
Esse é o erro que está dando agora.

Conversion from string " 2/81/1980" to type 'Date' is not valid.

Eu fiz uma alteração aqui. Mas não entendi muito o que fiz.

Onde você colocou mid(data,3,2) deu esse erro que eu coloquei quando eu mudei para mid(data,2,2) passou e foi para o IF do data válida, mas se eu altero a data dentro do TXT para 281080 sendo que o correto é 20101980 mesmo assim dá data válida e tem que aparecer data inválida. Eu coloquei essa data 28080 só para ver o que daria e mesmo assim passou como data válida, agora eu não sei se foi devido eu ter mudado para mid(data,2,2) pois o mid(data,3,2) deu erro.

Como pode isso..

data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)

dá erro..

data = left(data,2) & "/" & mid(data,2,2) & "/" & right(data,4)

aparece

2/28/1980 sendo que a data é 28111980

Dei um response.write(data) aparece 2/28/1980 e response.write(separar(35)) aparece 28111980 como pode isso?

------

Estou desconfiada que é alguma configuração no IIS, pois eu cliquei com o direito no diretório virtual e entrei em propriedades e encontrei Culture que estavb AF-ZA e Ul estava AF mudei para PT-br e Br, mesmo assim não funcionou. O que pode ser?

Mas depois que muder para PT-br e br o código data = left(data,2) & "/" & mid(data,2,2) & "/" & right(data,4) que funcionava não funciona mais.. Me ajudem please.

 

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leticia,

tenta jogar no formato universal: yyyy/MM/dd

 

Data = Right(Data, 4) & "/" & Mid(Data, 3, 2) & "/" & Left(Data, 2)

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz desse jeito e não teve jeito.. Voltei lá no IIS o normal que estava antes..

 

AF-ZA

AF e mesmo assim não foi.. dá esse erro..

 

Conversion from string "1980/81/ 2" to type 'Date' is not valid.

 

nessa linha

 

Dim DataConvertida as Date = CDate(data)

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal consegui resolver.. Era um espaço em branco que estava no arquivo txt.. agora está aparecendo corretamente.

no arquivo texto eu tenho isso..28111980 e depois dessa linha

data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)
aparece isso...28/11/1980 (perfeito..) é isso mesmo.. Mas se eu mudo dentro do arquivo txt para 281180 ainda aparece data válida e na tela fica assim 28/11/1180 e com isso o if tinha que cair no data inválida. segue código completo.

Dim data as String = (separar(35))	 data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4) Dim DataConvertida as Date = CDate(data)response.write(data)	if IsDate(DataConvertida) then	response.write("data válida")	else	response.write("data inválida")	end if arquivoStream.close()End Sub

Agora que está certo tenho que verificar se essa data é válida e se for o processamento continua normalmente caso contrário para e uma mensagem de data inválida vai para o usuário.. O estranho é que dentro desse código eu tenho o comando IsDate que não funciona pelo jeito, pois dentro do meu editor de aspx (Matrix) essa função nem fica azul como as demais.. exemplo cDate essa fica azul e IsDate não.. Onde estou errando para validar isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O web matrix já está mais que ultrapassado, na verdade nunca foi grande coisa. ;) Procure pelo Visual Web Developer Express, também gratuito, mas com muito mais recursos, compatível com o .NET 2.0... muito bom.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal. eu já beixei esse cara e instalei.. Mas mesmo assim esse meu código continua não validando essa data, mesmo se eu coloco uma data não válida ele dá erro ou exibe a data alterada acrescentando esse número 11 que nem faço idéia de onde ele tirou.Como resolver?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ou exibe a data alterada acrescentando esse número 11 que nem faço idéia de onde ele tirou

Exemplificando a função:Data =281180left(data,2) >>> Pega os dois primeiros caracteres à esquerda = "28"mid(data,3,2)>>> Pega a partir do terceiro num total de 2 caracteres="11"right(data,4) >>> Pega 4 caracteres à direita = "1180"você pode verificar se data tem 8 dígitos:
If Len(data)=8 Then...
Ou
data = left(data,2) & "/" & mid(data,3,2) & "/" & mid(data,5,4)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse

data = left(data,2) & "/" & mid(data,3,2) & "/" & mid(data,5,4)
deu certo, agora se eu tiro o 19 do 28111980 ele não "completa" mais com outros valores.

Duas coisas agora.. se eu digito 281180 dá como data válida.. pois é mesmo..rs Só que ele deveria dar como inválida pois preciso sempre ter a certeza que a data está com 4 dígitos no ano.

Só que quando eu coloco no TXT 281980 dá ERRO de conversão.. erro do aplicativo

Conversion from string "28/19/80" to type 'Date' is not valid e isso não pode acontecer tem que ser uma mensagem amigávél para o usuário.

Pensei em usar esse Len para resolver a questão de 4 dígitos no ano.. só que como juntar essas duas opções que você passou? Pois a primeira me resolve a questão dos 8 dígitos e a segunda me resolve a questão de quando a data é 281180 que ele fazia isso 28111180, só que agora não aparece essa data doida e sim dá erro.. como fazer esse erro também virar um erro amigável?

-------------------------Retificando-------------------------

A questão de 8 dígitos eu já resolvi, agora quando eu coloco dentro do arquivo texto uma data não válida..

Essa por exemplo.. dá erro 28192280 ---Conversion from string "28/19/2280" to type 'Date' is not valid.---

Como fazer isso virar uma mensagem mais amigável..

vejam o código..

Dim data as String = (separar(35))		If Len(data) = 8 Then			'data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)			'Data = Right(Data, 4) & "/" & Mid(Data, 4, 2) & "/" & Left(Data, 2)			data = Left(data, 2) & "/" & Mid(data, 3, 2) & "/" & Mid(data, 5, 4)			Dim DataConvertida As Date = CDate(data)			Response.Write("Data Inválida")			Response.Write(data)			arquivoStream.Close()		Else			Response.Write("Data Inválida")		End If		End Sub
tenho que fazer if acho para alem de ver se tem oito dígitos saber se é uma data válida.. mas estou me perdendo no if..

 

 

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal eu consegui.. ufa...

Dim data As String = (separar(35))		If Len(data) = 8 Then			data = Left(data, 2) & "/" & Mid(data, 3, 2) & "/" & Mid(data, 5, 4)			If Not IsDate(data) Then				Response.Write("Data no formato Inválido")			Else				Dim DataConvertida As Date = CDate(data)				'Response.Write(data)				Response.Write("Ok, data válida")				arquivoStream.Close()			End If		Else			Response.Write("Data deve ter oito dígitos e ser válida. Ex. 22/11/1977")		End If	End Sub
Mas para meu desespero eu dancei, pois depois eu mostrei que o pessoal me disseram o que me levou ao desespero..

Eu validei usando essa opção de separa(35) o eu é isso.. meu código vai no arquivo e conta 35 posições pois cada valor está separado por virgula. O código então pega somente o valor 28111980 só que pelo que eles me falaram vai ter arquivo que pode ter várias datas, ou seja vários registos.. Ai vem o problema.. como validar todas as datas do arquivo inteiro?

 

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como fazer isso virar uma mensagem mais amigável..

No ASP.NET usamos blocos Try Catch para tratar os erros.Ex:
Try 'Seu código aquiCatch ex as exception 'Código executado quando ocorre uma exceção Label1.text="Erro processando o arquivo<br>O erro foi: " & ex.toStringFinally ' Código executado obrigatoriamente ocorrendo ou não uma exceção ' Muito útil quando precisamos fechar conexões, liberar arquivos, etcEnd Try

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas para meu desespero eu dancei, pois depois eu mostrei que o pessoal me disseram o que me levou ao desespero..Eu validei usando essa opção de separa(35) o eu é isso.. meu código vai no arquivo e conta 35 posições pois cada valor está separado por virgula. O código então pega somente o valor 28111980 só que pelo que eles me falaram vai ter arquivo que pode ter várias datas, ou seja vários registos.. Ai vem o problema.. como validar todas as datas do arquivo inteiro?

Use a função SPLIT para separar os dados.Essa função retorna um Array com os campos.Ex:Dim texto as String="aaa,222,19072007"Dim myArray as Array=Split(texto,",")Dim myData as String=myArray(2) 'A contagem dos campos começa em zero. O terceiro campo é o de nº 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que legal arr, mas irei tentar deixar esse código mais profissional depois então na questão de tratamento de erros, pois agora com esses ifs que eu criei deram certo.

A questão é.. como fazer ele ler todas as datas do arquivo inteirinho e fazer essa validação que conseguimos fazer (eu juntamente com os membros que estão me ajudando, incluindo você) uma uma data apenas (separar(35).. eu já estou usando Split.

Vejam código completo.

<%@ Page Language="vb" Debug="true" %><%@ import Namespace="System.IO" %><script runat="server">	Sub page_load(Sender As Object,e As EventArgs)		 'define o local do arquivo	 Dim Arquivo as string = "c:\teste\ExcelData2.txt"		'define um arquivo do tipo streamreader e abre o arquivo	 Dim arquivoStream as StreamReader		 Dim delimitador as String = ","		 Dim i as integer		 try		arquivoStream = File.Opentext(Arquivo)	 catch ex as Exception		lblerro.text = " Arquivo não encontrado."			Exit Sub	 end try		 Dim conteudo as String = arquivoStream.ReadToEnd()		 lbltexto.text = conteudo & "<br>"		 Dim separar = Split(conteudo,delimitador)		lblresultado.text = separar(35)		Dim data As String = (separar(35))		If Len(data) = 8 Then			data = Left(data, 2) & "/" & Mid(data, 3, 2) & "/" & Mid(data, 5, 4)			If Not IsDate(data) Then				'data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)				'Data = Right(Data, 4) & "/" & Mid(Data, 4, 2) & "/" & Left(Data, 2)				Response.Write("Data no formato Inválido")			Else				Dim DataConvertida As Date = CDate(data)				'Response.Write(data)				Response.Write("Ok, data válida")				arquivoStream.Close()			End If		Else			Response.Write("Data deve ter oito dígitos e ser válida. Ex. 22/11/1977")		End If	End Sub</script><html><head></head><body>	<hr />	<font face="Trebuchet MS"><font color="blue"><strong>Arquivo Texto</strong> :</font></font>  <font face="Trebuchet MS">homero.txt</font> 	<p>	</p>	<p>		<asp:Label id="lbltexto" runat="server" font-names="Verdana" font-name="Verdana" font-size="X-Small" font-italic="True"></asp:Label>	</p>	<hr />	<font face="Trebuchet MS"><font color="#ff8040"><strong>Resultado</strong> :</font></font>  <font face="Trebuchet MS" size="2">usando	delimitador igual a ","</font> 	<p>		<strong><em> </em></strong><asp:Label id="lblresultado" runat="server" font-names="Verdana" font-name="Verdana" font-size="X-Small"></asp:Label><em> </em>	</p>	<em> 	<hr />	</em>  <asp:Label id="lblerro" runat="server" font-names="Trebuchet MS" forecolor="Red" font-bold="True"></asp:Label>  <br /></body></html>
Dentro desse txt tem isso..

 

0001,YPE ENG LTDA,8052007,

TIPO,CGC,TIPO DO USUARIO,CPF DO TITULAR,NOME DO USUARIO,NASCIMENTO,ESTADO CIVIL,ADMISSAO,DEMISSAO,FUNCAO,MAE,VALOR,CONTRIBUICAO,RECOLHE PARA DEPENDENTE,001,45218469874521,1,30234591424,RAFAEL LEITE,32111980,C,11092006,30052007,AJUDANTE GERAL,HEREMITA DA PENHA LEITE,620,S,001,44544574954546,2,45644445468,ROBERTA GIROTTO DE ARAUJO,28021983,C,DAGMAR NASCIMENTO GIROTTO DE ARAUJO,

001,45485454646546,3,57454418978,GIOVANNA GIROTTO DE ARAUJO LEITE,22102001,S,ROBERTA GIROTTO DE ARAUJO

 

Tenho uma primeira linha onde tem o tipo da informação (001) significa cadastro novo (002) atualização de cadastro. E nome da empresa

Vejam que essa linha em negrito é o cabaçalho.. e depois verão várias linhas preenchidas com as informações da empresa dependendo da empresa serão umas 100 linhas mais ou menos.

Como eu irei fazer para esse código que eu tenho hoje ler toda a coluna data ou o arquivo inteiro e validar somente as datas? Pois depois que conseguir validar as datas terei que validar os CPF e CNPJ.

 

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tinha visto que já estava usando o split...

 

Na hora de ler o arquivo você pode ler linha por linha dentro de um loop

 

Dim conteudo as StringDim separarWHILE NOT arquivoStream.EOF conteudo= arquivoStream.ReadLine()separar = Split(conteudo,delimitador)		lblresultado.text = separar(35)		Dim data As String = (separar(35))		If Len(data) = 8 Then			data = Left(data, 2) & "/" & Mid(data, 3, 2) & "/" & Mid(data, 5, 4)			If Not IsDate(data) Then				'data = left(data,2) & "/" & mid(data,3,2) & "/" & right(data,4)				'Data = Right(Data, 4) & "/" & Mid(Data, 4, 2) & "/" & Left(Data, 2)				Response.Write("Data no formato Inválido")			Else				Dim DataConvertida As Date = CDate(data)				'Response.Write(data)				Response.Write("Ok, data válida")				arquivoStream.Close()			End If		Else			Response.Write("Data deve ter oito dígitos e ser válida. Ex. 22/11/1977")		End IfWEND

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.. eu tentei executar esse código mas está dando esse erro..

Compiler Error Message: BC30456: 'EOF' is not a member of 'System.IO.StreamReader'.

Nessa linha

While arquivoStream.EOF

Mesmo quando eu digito o arquivoStream. (ele traz a lista de opções e nesta lista o EOF não está na lista)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade.. depois de tentar várias vezes pois fui tentando item por item da lista que aparecia. Cheguei nesse cara..Mas ele executou mas não validou nadica de nada.. Coloque as datas erradas dentro do TXT e o código passou batido sem validar nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voltei.. agora eu consegui encontrar alguma forma de ler linha a linha apenas de uma determinada colula.. mas preciso de um loop e não estou conseguindo juntar as peças.

Segue meu código inteiro.

Imports System.Data.oledbImports System.dataPartial Class _Default	Inherits System.Web.UI.Page	Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnProcurar.Click		Try			'obtendo a string de conexo do arquivo web.config			Dim conexaoExcel As String = System.Configuration.ConfigurationManager.ConnectionStrings.Item("conexaoExcel").ToString()			Dim dbConn As New OleDbConnection(conexaoExcel)			Dim strSQL As String			'montando a instruo SQL para obter os dados da planilha selecionada na caixa de listagem ddlExcel			dbConn.Open()			'strSQL = "SELECT CODIGO FROM [" & ddlExcel.SelectedItem.ToString() & "$] WHERE CODIGO = '0001'"			strSQL = "SELECT * FROM [Empresa$]"			'Executando a instruo SQL e criando um DataSet para receber os dados			Dim cmd As New OleDbCommand (strSQL, dbConn)			Dim dsExcel As New DataSet			Dim daExcel As New OleDbDataAdapter(cmd)			'preenchendo o DataSet e exibindo os dados no gridView			daExcel.Fill(dsExcel)			Dim TotalLinhas As String = dsExcel.Tables(0).Rows.Count			response.write(TotalLinhas)			If dsExcel.Tables(0).Rows.Count = 0 Then				Response.write("O Campo cdigo no est marcado como 000!")			End If			Dim linha As String = 3			linha = dsExcel.Tables(0).Rows(linha - 1).Item(4 - 1)			response.write(linha)			Dim teste As String			gdvExcel.DataSource = dsExcel			gdvExcel.DataBind()		Catch ex As Exception			Throw ex		End Try	End SubEnd Class
Agora essa parte é justamente a parte onde eu estou dizendo para pegar a linha (3) da quarta coluna.. agora se conseguirmos fazer um loop para sair cendo até o final do arquivo eu consigo fazer as validações de uma coluna.

 

'aqui eu conto quantas linhas tem no arquivo			'para usar essa variavel como parametro do for para saber quando cheguei no fim do arquivo			Dim TotalLinhas As String = dsExcel.Tables(0).Rows.Count			Dim linha As String = 3			linha = dsExcel.Tables(0).Rows(linha - 1).Item(4 - 1)			response.write(linha)

Será que alguém pode me ajudar?

Tentei fazer assim..

Dim i As String = 0			Dim TotalLinhas As String = dsExcel.Tables(0).Rows.Count			Dim linha As String = 3						for (i=0;TotalLinhas<i;i++)			linha = dsExcel.Tables(0).Rows(linha - 1).Item(4 - 1)			linha = linha +1			loop
O que eu quero com isso... Correr linha por linha da coluna 4.

Grata

 

Letícia

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.