Liberdade 0 Denunciar post Postado Julho 17, 2007 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 SubAgora 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 SubOlhem 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
arr 0 Denunciar post Postado Julho 17, 2007 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
Liberdade 0 Denunciar post Postado Julho 18, 2007 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 SubEsse é 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
eriva_br 7 Denunciar post Postado Julho 18, 2007 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
Liberdade 0 Denunciar post Postado Julho 18, 2007 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
Liberdade 0 Denunciar post Postado Julho 18, 2007 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
arr 0 Denunciar post Postado Julho 19, 2007 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
Liberdade 0 Denunciar post Postado Julho 19, 2007 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
arr 0 Denunciar post Postado Julho 19, 2007 ou exibe a data alterada acrescentando esse número 11 que nem faço idéia de onde ele tirouExemplificando 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...Oudata = left(data,2) & "/" & mid(data,3,2) & "/" & mid(data,5,4) Compartilhar este post Link para o post Compartilhar em outros sites
Liberdade 0 Denunciar post Postado Julho 19, 2007 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 Subtenho 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
Liberdade 0 Denunciar post Postado Julho 19, 2007 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 SubMas 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
arr 0 Denunciar post Postado Julho 19, 2007 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
arr 0 Denunciar post Postado Julho 19, 2007 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
Liberdade 0 Denunciar post Postado Julho 19, 2007 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
arr 0 Denunciar post Postado Julho 19, 2007 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
Liberdade 0 Denunciar post Postado Julho 20, 2007 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
arr 0 Denunciar post Postado Julho 20, 2007 Erro meu...arquivoStream.EndOfStream Compartilhar este post Link para o post Compartilhar em outros sites
Liberdade 0 Denunciar post Postado Julho 20, 2007 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
Liberdade 0 Denunciar post Postado Julho 26, 2007 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 ClassAgora 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 loopO 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