Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#4341
.NET (C#, VB.NET, ASP) / Re: Recortar caracteres
21 Octubre 2015, 12:27 PM
Cita de: Lekim en 21 Octubre 2015, 10:20 AMPor eso digo que debe haber varios formatos con misma extensión.

Lekim, lo vuelvo a explicar de otra manera:

NO existen distintos tipos de formato CSV, un CSV es un archivo de TEXTO PLANO (archivo.txt) con la extensión modificada (archivo.csv) cuyo contenido está delimitado por comas u otro caracter que queda a elección de quien construye la tabla.

No hay más misterio, el formato es texto plano o plain text.

El único estándar del formato CSV es que los campos se delimiten mediante un caracter, en este caso la coma, y en el caso de tu Excel, el punto y coma. Luego hay factores adicionales como lineas de comentarios, columnas, delimitación de cadenas en los campos, etc..




Cita de: Lekim en 21 Octubre 2015, 10:20 AMLuego el sistema para leerlo debe ser similar al Input en VB.

Tengo clarísimo que los ejemplos que he puesto yo se han creado y se leen siguiendo un sistema similar al Input en VB6.

Pongamos claro que un CSV es un archivo de texto y NADA más, no ha sido especialmente diseñado o pensado para "leerse con VB", no tiene nada que ver una cosa con la otra, no lo mezclemos.

La función Input de VB6 simplemente lee el string de entrada hasta que el siguiente caracter CR, CR-LF o "," se encuentra y entonces podemos tokenizar/partir el string de esa forma. Es basicamente lo mismo que podemos hacer con la extensión String.Split en VB.Net, de la siguiente manera:

Código (vbnet) [Seleccionar]
Dim tokens As String() = <a>"hello",14,</a>.Value.Split({ControlChars.Cr, ControlChars.CrLf, ","c, ";"c}, StringSplitOptions.None)

For Each token As String In tokens
   Console.WriteLine(token.Trim({ControlChars.Quote}))
Next token


La función Input de VB6 se puede encontrar en el namespace Microsoft.VisualBasic de la librería de clases de .Net Framework, la cual ovbiamente está re-escrita usando puro código .Net, sin embargo, aún así la función está deprecada u obsoleta al tener un impacto grave en el rendimiento de la app. (POR COSAS ASÍ NO ME CANSARÉ DE REPETIR QUE NO SE DEBE RECURRIR A NINGÚN MIEMBRO DE ESTE NAMESPACE VB6-ESTILIZADO) y se recomienda en su defecto utilizar los miembros de My.Computer.FileSystem, que viene siendo exactamente lo mismo que publiqué en el ejemplo de mi primer post en este hilo.

Ejemplo:
Código (vbnet) [Seleccionar]
Using parser As TextFieldParser = My.Computer.FileSystem.OpenTextFieldParser("File.csv", {",", ";"})

   Do Until parser.EndOfData

       ' ...

   Loop

End Using


Hablando estrictamente ese sería su equivalente, la class Microsoft.VisualBasic.FileIO.TextFieldParser. Pero en mi opinión personal es mejor recurrir a un simple For para construir la logica del parser y así evitar por completo la utilización de ese namespace, así que para mi el equivalente sería String.Split aunque sería bastante más elaborado que el For que he publicado, pero no voy a reinventar la rueda.

Saludos!
#4342
.NET (C#, VB.NET, ASP) / Re: Recortar caracteres
21 Octubre 2015, 10:04 AM
Cita de: Lekim en 21 Octubre 2015, 09:21 AMPero mantengo lo que dije pues he buscado ese tipo de archivos CSV, y hasta se pueden abrir con el notepad y son perfectamente legibles y sin comillas. No se quizás hay varios formatos.

Te explico, un archivo CSV o Comma-separated values, es un archivo de texto plano el cual, como su propia definición indica, está delimitado por comas (u otro caracter). No le des más vueltas xD.

Imagínate la siguiente tabla pero representada en un archivo de texto, pues las comas o caracter delimitador se usarían para separar los campos y así poder identificar a que columna pertenecen.




Archivo.csv
; Columnas
firstname,lastname,username,password,email
; Campos
Jhon,Williams,Jhon williams,xFE3fghuw4D,mail@elhacker.net
etc...


Nota(s):
La primera linea a veces se utiliza para delimitar el nombre de las columnas, simplemente depende de la forma en la que quieras parsear el archivo, es decir, se asume que existen nombres de columnas o se asume lo contrario.
Las lineas que empiezan con ";" serían lineas de comentario, que podría ser cualquier otro caracter excepto el caracter delimitador.




Cita de: Lekim en 21 Octubre 2015, 09:21 AMestoy de acuerdo con electro en que habría que ver como está escrito el texto, donde están las comas. Si no me equivoco debería ser algo similar a esto

Creo que no entendiste bien lo que quise decir.

En el ejemplo del CSV de Twitter, los campos esán separados por comas, y cada campo está encerrado entre comillas dobles, pues bien, dentro de ese string encerrado cabe la posibilidad de que también contenga comas por el simple hecho de que en Twitter un usuario puede escribir comentarios utilizando comas, pero claro, ese caracter especial estará codificado/escapado para no crear conflictos con la delimitación de los campos.

El caso es que para que en la transformación del string/comentario no queden "residuous" de caracteres codificados habria que comprobar si Twitter usa codificación html normal o no para ese caracter de la coma, y yo no lo he comprobado por que ...en fin, por que no voy a ponerme a buscar comentarios que tengan comas en Twitter xD.

Saludos!
#4343
.NET (C#, VB.NET, ASP) / Re: Recortar caracteres
21 Octubre 2015, 08:01 AM
Cita de: Eliza_loaeza en 21 Octubre 2015, 07:36 AMde estas lineas solo intento sacar los puros comentarios y eliminar el resto.

Entonces puedes hacer esto, usando LINQ (por ejemplo):

Código (vbnet) [Seleccionar]
Imports System.Web

Dim csvFilepath As String = "C:\file.csv"

Dim comments As IEnumerable(Of String) =
   From line As String In File.ReadAllLines(csvFilepath, Encoding.UTF8)
   Select HttpUtility.HtmlDecode(line.Split(","c)(5).Trim(ControlChars.Quote))

Me.ListBox1.Items.AddRange(comments.ToArray)


Nota: Habría que comprobar como están escapados los caracteres ilegales, igual que el caracter de la coma.

Saludos
#4344
En caso de que hayas optado por utilizar la alternativa de la Task, ten en cuenta como dije que la forma en la que lo debes hacer es asignándole un token de cancelación, cuyo nombre sirve para cancelar la tarea evidentemente, entonces lo usas y seguidamente utilizas el método Task.Wait para esperar a que la tarea finalice su cancelación antes de cerrar/liberar el form, de lo contrario se lanzará una excepción de tipo ObjectDisposedException al intentar invokar el control cuando ya ha sido liberado.

No es que sea muy importante ya que la excepción ocurrirá en el thread secundario, es decir, no saltará un mensaje de error ni nada en el thread de la UI, la excepción la podrás ver al depurar la app pero el form se cerrará como estaba previsto sin mostrar nada, de todas formas lo comento por que siempre es buena costumbre intentar evitar o controlar cualquier excepción que podamos preveer con antelación, en la medida de lo posible.

Saludos!
#4345
.NET (C#, VB.NET, ASP) / Re: Recortar caracteres
21 Octubre 2015, 07:17 AM
Primero de nada, lee atentamente la nota que un compañero moderador te dejó en tu último comentario:
Cita de: Engel LexMod: Los códigos deben ir en etiquetas GeSHi, esto es .NET, movido

Debes seguir las normas del foro.





Cita de: Eliza_loaeza en 20 Octubre 2015, 07:59 AM"652394532592467968,"","","2015-10-09 08:05:52 +0000","Twitter Web Client","Hay ocasiones en la que mejor prevalecer ‪#‎Sisepuede‬ y seguir adelante.","","","",""
646843948586045440,"","","2015-09-24 00:29:49 +0000","<a href=""http://twitter.com"" rel=""nofollow"">Twitter Web Client</a>","#sisepuede Seguimos adelante :)","","","",""

El formato es inteligible si nos rejimos por un estándar, ya que todos los campos están cerrados por comillas dobles excepto el primer campo, donde en la primera linea o columna contiene una comilla doble (que no dos) así que el campo no está cerrado/delimitado, y en el de la segunda linea no contiene comillas. ¿Realmente eso lo tienes así o has cometido un fallo al publicar el ejemplo?.


¿Que significa para ti "recortarlo"?. Intenta ser más específico, ¿te refieres a partir el string en varios tokens/partes?.
Tampoco está claro si en el listbox estás intentando añadir las lineas completas o solamente los campos de alguna columna del CSV.
Da más detalles. . .



Si quieres partir el archivo en un array de lineas o strings entonces puedes utilizar la función System.IO.File.ReadAllLines (o en su defecto la extensión String.Split):
Código (vbnet) [Seleccionar]
Dim csvFilepath As String = "C:\file.csv"
Dim csvLines As String() = File.ReadAllLines(csvFilepath, Encoding.Default)

Me.ListBox1.Items.AddRange(csvLines)




Para otro tipo de tareas, como por ejemplo obtener todos los campos de una sola columna de la tabla CSV, puedes utilizar la class Microsoft.VisualBasic.FileIO.TextFieldParser:

Código (vbnet) [Seleccionar]
Dim csvFilepath As String = "C:\file.csv"
Dim csvFields As New List(Of String)

Using csvParser As New TextFieldParser(csvFilepath, Encoding.Default, detectEncoding:=True) With {
   .TextFieldType = FieldType.Delimited,
   .Delimiters = {","},
   .HasFieldsEnclosedInQuotes = True
}

   Do Until csvParser.EndOfData
       Try
           csvFields.Add(csvParser.ReadFields(0)) ' Campo 0.

       Catch ex As MalformedLineException
           ' Linea con formato incorrecto...

       End Try
   Loop

End Using

Me.ListBox1.Items.AddRange(csvFields.ToArray)


PD: No recomiendo recurrir a los miembros del namespace Microsoft.VisualBasic excepto para esta ocasión, ya que aparte de que no existe un equivalente en el resto de miembros de la librería de clases de .Net Framework, es tontería ponerse a reinventar la rueda desarrollando un parser de formato CSV. Siempre puedes utilizar librerías de terceros para .Net, como por ejemplo: https://github.com/JoshClose/CsvHelper o http://www.filehelpers.net/
De todas formas el desarollo de un parser específico para la tarea que requieres en cuestión, sería muy sencillo, pero no está del todo claro lo que pretendes.

Saludos
#4346
Windows / Re: Fallo al actualizar a Windows 10
20 Octubre 2015, 19:24 PM
En vez de intentar actualizar, sobreescribe el S.O. realizando una instalación LIMPIA con una ISO de Windows 10 y no tendrás ese problema. Obviamente los datos de configuración de usuario se perderán, pero es una solución al problema a falta de una mejor solución, ya que si dices que intentas actualizar pero automáticamente el proceso de instalación/actualización hace un rollback de forma anómala restaurando la versión anterior de Windows sin dar ningún mensaje de error ni información sobre el problema... pues a menos que hagas una instalación limpia no se que más vas a poder hacer. Recuerda que los archivos personales y todo archivo antiguo se almacenará en la carpeta C:\Windows.old, así que el cliente no perdería nada importante en realidad.

De todas formas creo que se debe generar un log post-instalación-fallida en el directorio "X:\Windows\****.log" del Windows ya instalado, revísalo para obtener información sobre el fallo.

Saludos
#4348
Buenas.

No sabía si colocar este aporte en la sección de diseño gráfico, ya que las fuentes de texto no tienen por que acabar abarcar dicha temática.

En fin, les traigo una lista que he elaborado con casi 8.000 enlaces de fuentes de texto de calidad suprema (True Type y Open Type). Es un texto listo para copiar y pegar en su administrador de descargas favorito.

http://pastebin.com/q9CKV2Hg

Hay muchas fuentes conocidas "comerciales" como la que usa Disney u otras compañias/marcas de todo tipo. Hay todo tipo de fuentes, 3d, grunge, graffity, normales, a mano, etc.




La página de donde he sacado los enlaces:
http://www.1001fonts.com/

Y por si a alguien le sirve, este es el simple algoritmo de web-scraping que desarrollé para la ocasión. Está escrito en VisualBasic.Net.
Código (vbnet) [Seleccionar]
Dim urlFormat As String = "http://www.1001fonts.com/new-and-fresh-fonts.html?page={0}&items=50"
Dim currenturl As String
Dim includeDemoFonts As Boolean = False
Dim zipExp As New Regex("http([s])?.+\.zip", RegexOptions.IgnoreCase)

Dim fontList As New List(Of String)
Dim outputFile As String = "C:\fonts.txt"

For pageIndex As Integer = 1 To Integer.MaxValue

   currenturl = String.Format(urlFormat, pageIndex)

   Debug.WriteLine(String.Format(" Current page: {0}", pageIndex))
   Debug.WriteLine(String.Format(" Current url : {0}", currenturl))

   Try
       Using sr As New StreamReader(HttpWebRequest.Create(currenturl).GetResponse.GetResponseStream)

           For Each m As Match In zipExp.Matches(sr.ReadToEnd).Cast(Of Match)()

               If (Not includeDemoFonts) AndAlso (m.Value.ToLower.EndsWith("demo.zip")) Then
                   Continue For

               Else
                   If Not fontList.Contains(m.Value) Then
                       fontList.Add(m.Value)
                   End If

               End If

           Next m

       End Using

   Catch ex As WebException
       If (ex.Status = WebExceptionStatus.ProtocolError) AndAlso (ex.Message.Contains("404")) Then
           Exit For

       Else
           MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

       End If

   End Try

Next pageIndex

File.WriteAllLines(outputFile, fontList, Encoding.Default)
MessageBox.Show("Finished", "", MessageBoxButtons.OK, MessageBoxIcon.Information)


Si solo quieren descargar las fuentes de una categoría de la página la modificación de la query es muy sencilla, por ejemplo la categoría de fuentes 3D:
Código (vbnet) [Seleccionar]
Dim urlFormat As String = "http://www.1001fonts.com/3d-fonts.html?page={0}&items=50"

PD: Apenas tarda 1 minuto en recolectar los 8.000 enlaces.

Saludos!
#4349
¿Y esto lleva aquí desde el 13 de octubre? xD lo siento por la tardanza, luego le doy un repaso y te comento.

saludos




EDITO:

Prueba de la siguiente manera, pero no se muy bien como tienes la estructura de carpetas y archivos así que tal vez tengas que cambiar los parámetros de la iteración de carpetas y/o archivos.

Lo he escrito al vuelo sin testearlo (es un coñazo volver a recrear la estructura de archivos y carpetas). De todas formas creo que este ejemplo te servirá para que lo consigas hacer por ti mismo.

Código (vbnet) [Seleccionar]
   Public Sub FindAndMergeFiles(ByVal sourceDir As String)

       Const NameCM As String = "CM"
       Const NameGL As String = "GL"
       Const NameImp60 As String = "IMP6000"
       Const NameImp61 As String = "IMP6001"
       Const NameImp62 As String = "IMP6002"
       Const NameImp63 As String = "IMP6003"

       Dim curFilename As String

       ' Itero cada directorio del directorio de origen.
       For Each topDir As DirectoryInfo In New DirectoryInfo(sourceDir).
                                               GetDirectories("*", SearchOption.TopDirectoryOnly)

           ' Itero de forma recursiva cada subdirectorio del directorio actual.
           For Each subDir As DirectoryInfo In topDir.GetDirectories("*", SearchOption.AllDirectories)

               ' Itero de forma recursiva cada archivo de texto del directorio actual.
               For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.AllDirectories)

                   If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameCM

                   ElseIf txtfile.Name.Equals(NameGL, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameGL

                   ElseIf txtfile.Name.Equals(NameImp60, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameImp60

                   ElseIf txtfile.Name.Equals(NameImp61, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameImp61

                   ElseIf txtfile.Name.Equals(NameImp62, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameImp62

                   ElseIf txtfile.Name.Equals(NameImp63, StringComparison.OrdinalIgnoreCase) Then
                       curFilename = NameImp63

                   Else
                       curFilename = String.Empty

                   End If

                   If Not String.IsNullOrEmpty(curFilename) Then

                       Debug.WriteLine(topDir.FullName)
                       Debug.WriteLine(subDir.FullName)
                       Debug.WriteLine(txtfile.FullName)
                       Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))

                       Using sr As StreamReader = txtfile.OpenText
                           File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
                       End Using

                   End If

               Next txtfile

           Next subDir

       Next topDir

   End Sub


Modo de empleo en el código fuente que compartí en la página anterior:
Código (vbnet,5,6) [Seleccionar]
...
' Muevo los directorios (si alguno) con formato de fecha específico (ej. "yyyyMMdd"), del directorio fuente, al directorio de destino.
DateDirUtil.MoveDateDirectories(Me.year, monthNumber, DateDirUtil.DirNameFormat, Me.fdg.SelectedPath, dateDir)

' Merge text files.
DateDirUtil.FindAndMergeFiles(Me.fdg.SelectedPath)
...
#4350
Foro Libre / Re: Pedir un informe ETS a una mujer
19 Octubre 2015, 14:30 PM
Cita de: dimitrix en 19 Octubre 2015, 00:59 AMEn este caso ¿Es moral pedir un informe ETS (Enfermedad Transmisión Sexual) a esa moza?

PD: La respuesta no puede ser "hacerlo con protección", ya que eso es lógico.

Dimitrix yo a veces flipo con tus preguntas macho, no se si lo haces ya a propósito solo por hablar de tus nuevas conquistas x'D. Es que es increible, quien haya estado con mujeres ya sabe la reacción que va a haber en una pregunta así, indiferentemente de si es moral o no.

Tú tienes todo el derecho a pedirle lo que creas conveniente a una mujer, claro está, ahora, como no exista una MUY buena confianza de relación de PAREJA entonces no esperes que ella se vaya a gastar el dineral que cuesta hacerse las pruebas para satisfacer tu "capricho", ya que según tengo entendido no hay un examen general de ETS, son pruebas específicas por separado para cada análisis de cada enfermedad y si ella acudiese a un laboratorio privado (por eso de la confianza plus la confidencialidad) se le caerían las bragas del susto que cuesta hacerse las pruebas.

En resumen, que probablemente te llevarías una torta o un "NO" antes que poder ver las pruebas esas... a menos que exista mucha, muchísima confianza y le pagues tú las pruebas, que eres el interesado.

De todas formas, ¿cual es el problema aquí?, si usas condón y toda enfermedad de transmisión sexual se evita con condón (excepto las que afectan a la zona que no está protegida por el condón claro está, como el roce de llagas vaginales infectadas con la piel desprotegida), si ella tuviese algo pues bueno ...no rechistes que mientras uses la gomita no pillarás nada que sea grave. Y tampoco nos pongamos más dramáticos de la cuenta que si ella tuviese ébola tú lo pillarías en muchas otras más circunstancia estando con ella tengas sexo o no.

Saludos!