Foros del Web » Programando para Internet » ASP Clásico »

Problemas al escribir en fichero con WriteLine !! Me supera

Estas en el tema de Problemas al escribir en fichero con WriteLine !! Me supera en el foro de ASP Clásico en Foros del Web. Saludos a todos Llevo varios días atascado con un problema muy tonto, pero que me trae de cabeza. Tengo que leer unos ficheros remotos y ...
  #1 (permalink)  
Antiguo 14/12/2009, 17:51
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 5 meses
Puntos: 0
Problemas al escribir en fichero con WriteLine !! Me supera

Saludos a todos

Llevo varios días atascado con un problema muy tonto, pero que me trae de cabeza.
Tengo que leer unos ficheros remotos y copiarlos en mi servidor, para ello leeo el fichero lo dejo en una variable y luego creo un fichero en mi servidor y escribo la variable dentro del mismo y ya está.

Me funciona con muchos de ellos pero hay algunos que me da un error y no entiendo el motivo.

Incluso lo puedo ver en pantalla pero no escribirlo proque cuando llamo a file_ES.WriteLine(Text_Ficha_ES) me dice:
Error de Microsoft VBScript en tiempo de ejecución (0x800A0005)
Argumento o llamada a procedimiento no válidos


Por cierto, tengo permisos para escribir y modificar en el directorio

En el siguiente ejemplo adjunto 2 opciones, con la primera veréis que no funciona mientras que con la segunda opción funciona perfectamente.


Código:
path_file = "F:\DATOS\PUBLI06\fichas\"   ' Donde dejaremos el fichero
name_file = "prueba.htm"                        ' Nombre del fichero

' Con esta URL NO Funciona
strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=301192EK;vendor=LACIE;lang=ES;shopname=OpenICEcat-url#"

' Con esta URL SI Funciona
'strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=3093B003AA;vendor=CANON;lang=ES;shopname=OpenICEcat-url#"
'
' Leemos el fichero
'			
Set HttpObj_ES = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
HttpObj_ES.SetTimeouts 50000, 60000, 10000, 100000 
HttpObj_ES.Open "GET", strURL_ES, false 
HttpObj_ES.Send() 
Text_Ficha_ES = HttpObj_ES.ResponseText
Set HttpObj_ES = Nothing
'
Set fs_ES = CreateObject("Scripting.FileSystemObject") 	' Creamos el Fichero
Set file_ES = fs_ES.CreateTextFile(path_file & name_file,True)' Abrimos el Fichero	
file_ES.WriteLine(Text_Ficha_ES) ' Escribimos en el fichero	
'Response.Write(Text_Ficha_ES)  ' Si queremos ver en pantalla
file_ES.Close			
Set file_ES = Nothing
Set fs_ES = Nothing
He buscado por el Google y en varios sitios pero no se ver un problema parecido.

Os agradezco mucho una respuesta
  #2 (permalink)  
Antiguo 14/12/2009, 18:43
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Quizá tienes algún caracter que este perjudicando al WriteLine, prueba cambiando esa linea por esta:

file_ES.WriteLine(Server.HTMLEncode(Text_Ficha_ES) )

Saludos
  #3 (permalink)  
Antiguo 15/12/2009, 11:52
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Al cambiar esta línea, me crea una página HTML que me muestra el código. A mí lo que me interesa es que me cree la página HTML que se pueda ejecutar con cualquier navegador, tal y como hace la otra.

No acaba de funcionar. Alguna sugerencia?
  #4 (permalink)  
Antiguo 15/12/2009, 16:52
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Edito

Ya vi a qué te referías ...

Ok ... después de hacer algunas pruebas veo que el adicionar un charset al WinHttpRequest con el método SetRequestHeader no funciona (no he caído en cuenta el por que ), ya habrás notado que el error lo causan los apóstrofes invertidos ‘ ’ que tienes en la descripción del sw incluido. Lo que hice fue grabarlo como te había sugerido con HTMLEncode pero remplazando la códificación UTF-8 por iso-8859-1 en la etiqueta META, con ello esos caracteres se transforman a texto plano y ya no hay problema, el detalle es que también hay que hacer una función con todos los replaces para que las tíldes se muestren correctamente

Código ASP:
Ver original
  1. Function Remplaza(Cadena)
  2.     aux = Cadena
  3.     aux = Replace(aux, "á", "á")
  4.     aux = Replace(aux, "é", "é")
  5.     aux = Replace(aux, "í", "í")
  6.     aux = Replace(aux, "ó", "ó")
  7.     aux = Replace(aux, "ú", "ú")
  8.     aux = Replace(aux, "ñ", "ñ")
  9. etc etc
  10.         Remplaza = aux
  11. End Function

Algo cucha la solución pero a mi me funcionó.

Igual si tuviera tiempo le gastaría más por el lado de la codificación, pero a veces esto no es posible y hay que sacar algo que funcione ya

Saludos

Última edición por Myakire; 15/12/2009 a las 18:11
  #5 (permalink)  
Antiguo 16/12/2009, 18:24
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Hola Myakire. Ante todo muchas gracias por tu ayuda.

Esto sigue sin funcionar correctamente. Hoy llevo varias horas con esto y no consigo que funcione. Si que se muestra perfectamente en pantalla pero al escribirlo en un fichero sigue con el mismo problema.

Me estoy atascando y tengo que resolverlo con urgencia, pues tiene que empezar a funcionar ya, pero me empieza a superar esta tontería. Piensa que tengo que leer casi 20.000 fichas similares... Leo estas fichas según una base de datos, todo es correcto pero se atasca en algunas como la del ejemplo y me para el proceso.

He utilizado la función que comentas para salir del paso y ya lo mejoraré pero no funciona. Incluso, primero lo que hago es pasarlo a ISO-88591 para que me sea compatible con mi sistema y luego remplazar con la función. (Se ve perfecto si se imprime en pantalla) pero el fichero da un error si se intenta escribir.

Puedes si quieres pegar el código y comprobar lo que comento.

Adjunto el código completo

Código:
path_file = "F:\DATOS\PUBLI06\fichas\"
name_file = "prueba.htm"
strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=301192EK;vendor=LACIE;lang=ES;shopname=OpenICEcat-url#"
'strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=3093B003AA;vendor=CANON;lang=ES;shopname=OpenICEcat-url#"
			
Set HttpObj_ES = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
'HttpObj_ES.SetTimeouts 50000, 60000, 10000, 100000 
HttpObj_ES.Open "GET", strURL_ES, false 
HttpObj_ES.Send() 
Text_Ficha_ES = HttpObj_ES.ResponseText
Set HttpObj_ES = Nothing
'
'-- Creamos el fichero
'
Set fs_ES = CreateObject("Scripting.FileSystemObject") 	' Creamos el Fichero
Set file_ES = fs_ES.CreateTextFile(path_file & name_file,True)	' Abrimos el Fichero
Text_Ficha_ES = DecodeUTF8(Text_Ficha_ES)
Text_Ficha_ES = Remplaza(Text_Ficha_ES)

'file_ES.WriteLine(Text_Ficha_ES)		' Escribimos en el fichero				
Response.Write(Text_Ficha_ES) 			' Mostramos la ficha en pantalla
file_ES.Close
Set file_ES = Nothing
Set fs_ES = Nothing

'--------------------------------
'-- Decodificador de UTF-8 a ISO-8859-1 
'--------------------------------
	function DecodeUTF8(s)
	  dim i
	  dim c
	  dim n

	  i = 1
	  do while i < len(s)
	    c = asc(mid(s,i,1))
	    if c and &H80 then
	      n = 1
	      do while i + n < len(s)
	        if (asc(mid(s,i+n,1)) and &HC0) <> &H80 then
	          exit do
	        end if
	        n = n + 1
	      loop
	      if n = 2 and ((c and &HE0) = &HC0) then
	        c = asc(mid(s,i+1,1)) + &H40 * (c and &H01)
	      else
	        c = 191 
	      end if
	      s = left(s,i-1) + chr(c) + mid(s,i+n)
	    end if
	    i = i + 1
	  loop
	  DecodeUTF8 = s 
	end function	
'--------------------------------
Function Remplaza(Cadena)
    aux = Cadena
    aux = Replace(aux, "À", "&Agrave;")  '-   capital a, grave accent 
    aux = Replace(aux, "Á", "&Aacute;")  '-   capital a, acute accent 
    aux = Replace(aux, "Â", "&Acirc;")  '-   capital a, circumflex accent 
    aux = Replace(aux, "Ã", "&Atilde;")  '-   capital a, tilde 
    aux = Replace(aux, "Ä", "&Auml;")  '-   capital a, umlaut mark 
    aux = Replace(aux, "Å", "&Aring;")  '-   capital a, ring 
    aux = Replace(aux, "Æ", "&AElig;")  '-   capital ae 
    aux = Replace(aux, "Ç", "&Ccedil;")  '-   capital c, cedilla 
    aux = Replace(aux, "È", "&Egrave;")  '-   capital e, grave accent 
    aux = Replace(aux, "É", "&Eacute;")  '-   capital e, acute accent 
    aux = Replace(aux, "Ê", "&Ecirc;")  '-   capital e, circumflex accent 
    aux = Replace(aux, "Ë", "&Euml;")  '-   capital e, umlaut mark 
    aux = Replace(aux, "Ì", "&Igrave;")  '-   capital i, grave accent 
    aux = Replace(aux, "Í", "&Iacute;")  '-   capital i, acute accent 
    aux = Replace(aux, "Î", "&Icirc;")  '-   capital i, circumflex accent 
    aux = Replace(aux, "Ï", "&Iuml;")  '-   capital i, umlaut mark 
    aux = Replace(aux, "Ð", "&ETH;")  '-   capital eth, Icelandic 
    aux = Replace(aux, "Ñ", "&Ntilde;")  '-   capital n, tilde 
    aux = Replace(aux, "Ò", "&Ograve;")  '-   capital o, grave accent 
    aux = Replace(aux, "Ó", "&Oacute;")  '-   capital o, acute accent 
    aux = Replace(aux, "Ô", "&Ocirc;")  '-   capital o, circumflex accent 
    aux = Replace(aux, "Õ", "&Otilde;")  '-   capital o, tilde 
    aux = Replace(aux, "Ö", "&Ouml;")  '-   capital o, umlaut mark 
    aux = Replace(aux, "Ø", "&Oslash;")  '-   capital o, slash 
    aux = Replace(aux, "Ù", "&Ugrave;")  '-   capital u, grave accent 
    aux = Replace(aux, "Ú", "&Uacute;")  '-   capital u, acute accent 
    aux = Replace(aux, "Û", "&Ucirc;")  '-   capital u, circumflex accent 
    aux = Replace(aux, "Ü", "&Uuml;")  '-   capital u, umlaut mark 
    aux = Replace(aux, "Ý", "&Yacute;")  '-   capital y, acute accent 
    aux = Replace(aux, "Þ", "&THORN;")  '-   capital THORN, Icelandic 
    aux = Replace(aux, "ß", "&szlig;")  '-   small sharp s, German 
    aux = Replace(aux, "à", "&agrave;")  '-   small a, grave accent 
    aux = Replace(aux, "á", "&aacute;")  '-   small a, acute accent 
    aux = Replace(aux, "â", "&acirc;")  '-   small a, circumflex accent 
    aux = Replace(aux, "ã", "&atilde;")  '-   small a, tilde 
    aux = Replace(aux, "ä", "&auml;")  '-   small a, umlaut mark 
    aux = Replace(aux, "å", "&aring;")  '-   small a, ring 
    aux = Replace(aux, "æ", "&aelig;")  '-   small ae 
    aux = Replace(aux, "ç", "&ccedil;")  '-   small c, cedilla 
    aux = Replace(aux, "è", "&egrave;")  '-   small e, grave accent 
    aux = Replace(aux, "é", "&eacute;")  '-   small e, acute accent 
    aux = Replace(aux, "ê", "&ecirc;")  '-   small e, circumflex accent 
    aux = Replace(aux, "ë", "&euml;")  '-   small e, umlaut mark 
    aux = Replace(aux, "ì", "&igrave;")  '-   small i, grave accent 
    aux = Replace(aux, "í", "&iacute;")  '-   small i, acute accent 
    aux = Replace(aux, "î", "&icirc;")  '-   small i, circumflex accent 
    aux = Replace(aux, "ï", "&iuml;")  '-   small i, umlaut mark 
    aux = Replace(aux, "ð", "&eth;")  '-   small eth, Icelandic 
    aux = Replace(aux, "ñ", "&ntilde;")  '-   small n, tilde 
    aux = Replace(aux, "ò", "&ograve;")  '-   small o, grave accent 
    aux = Replace(aux, "ó", "&oacute;")  '-   small o, acute accent 
    aux = Replace(aux, "ô", "&ocirc;")  '-   small o, circumflex accent 
    aux = Replace(aux, "õ", "&otilde;")  '-   small o, tilde 
    aux = Replace(aux, "ö", "&ouml;")  '-   small o, umlaut mark 
    aux = Replace(aux, "ø", "&oslash;")  '-   small o, slash 
    aux = Replace(aux, "ù", "&ugrave;")  '-   small u, grave accent 
    aux = Replace(aux, "ú", "&uacute;")  '-   small u, acute accent 
    aux = Replace(aux, "û", "&ucirc;")  '-   small u, circumflex accent 
    aux = Replace(aux, "ü", "&uuml;")  '-   small u, umlaut mark 
    aux = Replace(aux, "ý", "&yacute;")  '-   small y, acute accent 
    aux = Replace(aux, "þ", "&thorn;")  '-   small thorn, Icelandic 
    aux = Replace(aux, "ÿ", "&yuml;")  '-   small y, umlaut mark 
    aux = Replace(aux, "¡", "&iexcl;")  '-   inverted exclamation mark 
    aux = Replace(aux, "¢", "&cent;")  '-   cent 
    aux = Replace(aux, "£", "&pound;")  '-   pound 
    aux = Replace(aux, "¤", "&curren;")  '-   currency 
    aux = Replace(aux, "¥", "&yen;")  '-   yen 
    aux = Replace(aux, "¦", "&brvbar;")  '-   broken vertical bar 
    aux = Replace(aux, "§", "&sect;")  '-   section 
    aux = Replace(aux, "¨", "&uml;")  '-   spacing diaeresis 
    aux = Replace(aux, "©", "&copy;")  '-   copyright 
    aux = Replace(aux, "ª", "&ordf;")  '-   feminine ordinal indicator 
    aux = Replace(aux, "«", "&laquo;")  '-   angle quotation mark (left) 
    aux = Replace(aux, "¬", "&not;")  '-   negation 
    aux = Replace(aux, "®", "&reg;")  '-   registered trademark 
    aux = Replace(aux, "¯", "&macr;")  '-   spacing macron 
    aux = Replace(aux, "°", "&deg;")  '-   degree 
    aux = Replace(aux, "±", "&plusmn;")  '-   plus-or-minus  
    aux = Replace(aux, "²", "&sup2;")  '-   superscript 2 
    aux = Replace(aux, "³", "&sup3;")  '-   superscript 3 
    aux = Replace(aux, "´", "&acute;")  '-   spacing acute 
    aux = Replace(aux, "µ", "&micro;")  '-   micro 
    aux = Replace(aux, "¶", "&para;")  '-   paragraph 
    aux = Replace(aux, "·", "&middot;")  '-   middle dot 
    aux = Replace(aux, "¸", "&cedil;")  '-   spacing cedilla 
    aux = Replace(aux, "¹", "&sup1;")  '-   superscript 1 
    aux = Replace(aux, "º", "&ordm;")  '-   masculine ordinal indicator 
    aux = Replace(aux, "»", "&raquo;")  '-   angle quotation mark (right) 
    aux = Replace(aux, "¼", "&frac14;")  '-   fraction 1/4 
    aux = Replace(aux, "½", "&frac12;")  '-   fraction 1/2 
    aux = Replace(aux, "¾", "&frac34;")  '-   fraction 3/4 
    aux = Replace(aux, "¿", "&iquest;")
    aux = Replace(aux, "×", "&times;")
    aux = Replace(aux, "÷", "&divide;")  '- 
        Remplaza = aux
End Function
  #6 (permalink)  
Antiguo 17/12/2009, 11:03
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

mmmmmmmmmmmmmmmmm

ok

a ver, ¿y si lo hacemos caracter por caracter y remplazamos el que nos cause el error?

Código ASP:
Ver original
  1. path_file = "C:\Inetpub\wwwroot\Sitios\MisPruebas\"
  2. name_file = "prueba.htm"
  3. strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=301192EK;vendor=LACIE;lang=ES;shopname=OpenICEcat-url#"
  4. 'strURL_ES = "http://prf.icecat.biz/index.cgi?prod_id=3093B003AA;vendor=CANON;lang=ES;shopname=OpenICEcat-url#"
  5.            
  6. Set HttpObj_ES = CreateObject("WinHttp.WinHttpRequest.5.1")
  7. HttpObj_ES.SetTimeouts 50000, 60000, 10000, 100000
  8. HttpObj_ES.Open "GET", strURL_ES, false
  9. HttpObj_ES.Send()
  10.  
  11. Text_Ficha_ES = HttpObj_ES.ResponseText
  12. Set HttpObj_ES = Nothing
  13. '
  14. '-- Creamos el fichero
  15. '
  16. Set fs_ES = CreateObject("Scripting.FileSystemObject")  ' Creamos el Fichero
  17. Set file_ES = fs_ES.CreateTextFile(path_file & name_file,True)  ' Abrimos el Fichero
  18.  
  19. ON ERROR RESUME NEXT
  20. Salida = ""
  21. FOR i=1 to LEN(Text_Ficha_ES)
  22.    Caracter = MID(Text_Ficha_ES, i, 1)
  23.      if Caracter = vbCrLf Then
  24.       file_ES.Writeline(Caracter)
  25.      Else
  26.       file_ES.Write(Caracter)
  27.      End If
  28.    If Err.Number <> 0 then
  29.       file_ES.Write("")
  30.       Error.Clear
  31.    End If
  32.      Salida = Salida & Caracter
  33. NEXT
  34. 'Response.Write(Salida)
  35. file_ES.Close
  36. Set file_ES = Nothing
  37. Set fs_ES = Nothing

te sirve esa alternativa?
  #7 (permalink)  
Antiguo 18/12/2009, 11:57
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Gracias por la respuesta Myakire

De esta forma funciona correctamente y no da errores, por lo que no puedo ver donde se atascaba. Esto significa que el WriteLine se atasca por algún motivo de los carácteres, o que tiene una limitación del tamaño de la variable a imprimir, o lo que sea. He buscado por ahí, pero no veo nada en Microsoft que indique una limitación.

El escribir caracter a caracter tiene "la desventaja" de la lentitud y supongo que me cargará un poco más el servidor, de todas formas este proceso debería realizarse bastante a menudo.

He calculado que crea un fichero cada 1,4 sg. pues me crea 92 ficheros en 128 segundos. Esto significa que 25.000 ficheros tardarían 9,8horas. Impensable, si tengo en cuenta que ademas ejecuto otros procesos simultáneos de sicronización de datos en SQL, etc... y el comercio electrónico que está funcionando las 24h
Tendría que bajar el tiempo a la mitad como mínimo para que se ejecute por la madrugada.

La idea es que el programa primero mire si existe ya creado el fichero y si es así que no la haga, en caso contrario que lo añada. Esto no tiene ningún problema en hacerlo. Para mí y despues de mi atasco lo que me preocupa es que debería conseguir una creación tipo WriteLine() que es mucho más rápida que con el bucle. (Si consigues información te lo agradecería muchísimo)

Saludos.
  #8 (permalink)  
Antiguo 18/12/2009, 18:50
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Respuesta: Problemas al escribir en fichero con WriteLine !! Me supera

Recordaras que ya te había mencionado la causa del error:
Cita:
Ok ... después de hacer algunas pruebas veo que el adicionar un charset al WinHttpRequest con el método SetRequestHeader no funciona (no he caído en cuenta el por que ), ya habrás notado que el error lo causan los apóstrofes invertidos ‘ ’ que tienes en la descripción del sw incluido
Por eso lo de la codificación, esas comillas las tienes en tu BD's pero esta debe de tener alguna codificación distinta a las que estamos probando, por eso el código no las puede interpretar.

Debes investigar la codificación de tu base de datos e igual el server a esa, para eso es response.Charset, incluso creo que hay un objeto especial para estos casos de chilisoft o chilikat, ya no recuerdo

Sobre el procesar tal cantidad de archivos, supongo que con tu validación de su el fichera ya existe, verás que solo una vez vas a procesar esos 25000, el resto de las veces supongo solo serán unas cuantas docenas cada día, no se.

Aquí la solución es detectar esos caracteres problemáticos y eliminarlos; ya sea cambiando el juego de caracteres, o desde la base de datos, no se que sea más viable para ti, dependiendo de tu urgencia en terminar esta tarea.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:11.