elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Recortar caracteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Recortar caracteres  (Leído 8,146 veces)
Eliza_loaeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Recortar caracteres
« en: 20 Octubre 2015, 07:59 am »

Hola que tal, solicito de su ayuda con este problema estoy trabajando con vb y estoy cargando el contenido de un archivo .csv  ejemplo

Código:
"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 :)","","","",""

en el archivo tengo aprox 1000 lineas, lo que quiero hacer es recortar todo y que solo quede el texto y pueda mostrarlo en un listbox

     Hay ocasiones en la que mejor prevalecer #Sisepuede y seguir adelante
Ojala puedan ayudarme saludos


« Última modificación: 21 Octubre 2015, 07:25 am por Eleкtro » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Recortar caracteres
« Respuesta #1 en: 20 Octubre 2015, 20:45 pm »

Hola Eliza

Estaba intentado resolver tu problema hasta que me he dado cuenta de una cosa, y es que la cadena que muestra no tiene ningún sentido:

Código:
"652394532592467968,"","","2015-10-09 08:05:52 +0000","Twitter Web Client","Hay ocasiones en la que mejor prevalecer ‪#‎Sisepuede‬ y seguir adelante."

¿De verdad esto es así? Porque yo he buscado este tipo de archivo que nombras *.csv y no tienen ese formato.

Esto lo he sacado de WIN32API.CSV:
Código:
Element Name,Windows NT,Windows,Windows CE,Win32s,Component,Component Version,Header File,Import Library,Unicode,Element Type
ADsBuildEnumerator,4.0 or later,,,,ADSI,,adshlp.h,,,function
ADsBuildVarArrayInt,4.0 or later,,,,ADSI,,adshlp.h,,,function
ADsBuildVarArrayStr,4.0 or later,,,,ADSI,,adshlp.h,,,function
...


Creo que el archivo que intentas abrir se ha creado utilizando Open/For Append y Write. Este método crea los archivos con comillas:

Código:
NumFile = FreeFile
Open NombreFichero For Append As NumFile
Write #NumFile , Date$, Time$, Time$, "00:00:00"
Close NumFile

Se obtiene un archivo con el texto:

Código:
"10-20-2015","23:30:13","23:30:13","00:00:00"

Ahora al intentar leerlo la cosa se te complica. Para leerlo se hace de la siguiente manera:

Código:
NumFile = FreeFile
Open NombreFichero For Input As NumFile
Input #NumFile , Dato1, Dato2, Dato3, Dato4
Close NumFile

Ejemplo:
Código
  1. Option Explicit
  2.  
  3. Private Sub cmdGuardar_Click()
  4. Dim NombreFichero As String
  5. Dim NumFile As Integer
  6.  
  7. NombreFichero = App.Path & "\Prueba.txt"
  8. NumFile = FreeFile
  9.  
  10. Open NombreFichero For Append As NumFile
  11. Write #NumFile , Date$, Time$, Time$, "00:00:00"
  12. Close NumFile
  13.  
  14. 'Se guarda con este formato
  15. '"10-20-2015","23:27:56","23:27:56","00:00:00"
  16. End Sub
  17.  
  18. Private Sub cmdAbrir_Click()
  19. Dim NombreFichero As String
  20. Dim Dato1 As String, Dato2 As String, Dato3  As String, Dato4 As String
  21. Dim NumFile As Integer
  22.  
  23. NombreFichero = App.Path & "\Prueba.txt"
  24. NumFile = FreeFile
  25.  
  26. Open NombreFichero For Input As NumFile
  27. Input #NumFile , Dato1, Dato2, Dato3, Dato4
  28. Close NumFile
  29. Text1.Text = Dato1 & "  " & Dato2 & "  " & Dato3 & "  " & Dato4
  30.  
  31. 'Se Abre con este formato (sin comillas)
  32. '10-20-2015  23:27:56  23:27:56  00:00:00
  33. End Sub
  34.  
  35.  

Voy a proponerte otra manera y luego si puedes me comentas si te sirve.

Saludos



Pues lo prometido es deuda.

Este código lee un archivo CSV  (normal, sin comillas) e introduce línea por línea en un ListBox

Código
  1. Option Explicit
  2. Private Sub Command1_Click()
  3.  Dim Texto As String
  4.  Dim DirFile As String
  5.  
  6.  '//Directorio donde se encuentra el archivo
  7.  DirFile = App.Path & "\goURL_lr_photoshop_cz.csv"
  8.  
  9.  'Obtiene el texto
  10.  Texto = LeerArchivo(DirFile)
  11.  
  12.  'Obtiene las líneas y las introduce en un ListBox
  13.   Call CrearListaCompleta(Texto, List1)
  14.  
  15. End Sub
  16. '//Proceso para obtener las líneas de un texto
  17. Public Sub CrearListaCompleta(ByVal strLista As String, ByVal objList As ListBox)
  18.    Dim Lineas() As String
  19.    Dim i As Integer
  20.    Lineas = Split(strLista, vbNewLine)
  21.    For i = LBound(Lineas) To UBound(Lineas)
  22.        If Lineas(i) <> "" Then objList.AddItem Lineas(i)
  23.    Next
  24. End Sub
  25.  
  26. Public Function LeerArchivo(ByVal DirFile As String) As String
  27.  Dim FileName As String
  28.  Dim File As Integer
  29.  File = FreeFile
  30.  FileName = DirFile
  31.  Open FileName For Input As File
  32.    LeerArchivo = Input(LOF(File), #File)
  33.  Close File
  34. End Function
  35.  

Para guardar una archivo de texto (sin que se creen comillas) puedes usar esto:

Código
  1. Public Function GuardarArchivoTexto(ByVal strTexto As String, ByVal FileName As String)
  2.  Dim File As Integer, Cont As Integer, cDato As String
  3.  On Error GoTo EvitarError
  4.      File = FreeFile
  5.  Open FileName For Binary As #File
  6. For Cont = 1 To Len(strTexto)
  7.    Put #File, Cont, strTexto
  8.    Close #File
  9. Next
  10. EvitarError:
  11. Select Case Err.Number
  12.    Case 91
  13.    Resume Next
  14. End Select
  15. End Function
  16.  

Para llamarlo:
Código
  1. Dim Texto as Sring
  2. Texto = "¡Hola que tal!"
  3. Call GuardarArchivoTexto(Texto , "C:\Prueba.txt")  
  4.  

y si va a ser CSV

Código
  1. Dim Texto as Sring
  2. Texto = "¡Hola que tal!"
  3. Call GuardarArchivoTexto(Texto , "C:\Prueba.csv")  
  4.  


Espero que te sirva  ;)


« Última modificación: 20 Octubre 2015, 23:58 pm por Lekim » En línea

Eliza_loaeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Recortar caracteres
« Respuesta #2 en: 21 Octubre 2015, 05:29 am »

Hola Lekim Gracias por contestar
Asi es como cargo el archivo
Código
  1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  2.        Dim fileReader As System.IO.StreamReader
  3.        Me.ListBox1.Items.Clear()
  4.        Dim stringReader As String
  5.        fileReader = My.Computer.FileSystem.OpenTextFileReader("C:\\tweets.csv")
  6.        Do
  7.            stringReader = fileReader.ReadLine()
  8.            If Not stringReader Is Nothing Then
  9.  
  10.                If stringReader.Length <> 0 Then
  11.  
  12.                    Me.ListBox1.Items.Add(stringReader)
  13.  
  14.                End If
  15.            End If
  16.        Loop Until stringReader Is Nothing
  17.        fileReader.Close()
  18.  
  19.   End Sub

lo envio a un listbox, lo que intento hacer es antes de cargar el archivo poder cortarlo. me ha servido de mucho tu informacion gracias saludos. ;-)


Mod: Los códigos deben ir en etiquetas GeSHi, esto es .NET, movido
« Última modificación: 21 Octubre 2015, 07:18 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recortar caracteres
« Respuesta #3 en: 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 Lex
Mod: Los códigos deben ir en etiquetas GeSHi, esto es .NET, movido

Debes seguir las normas del foro.




Código:
"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
  1. Dim csvFilepath As String = "C:\file.csv"
  2. Dim csvLines As String() = File.ReadAllLines(csvFilepath, Encoding.Default)
  3.  
  4. 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
  1. Dim csvFilepath As String = "C:\file.csv"
  2. Dim csvFields As New List(Of String)
  3.  
  4. Using csvParser As New TextFieldParser(csvFilepath, Encoding.Default, detectEncoding:=True) With {
  5.    .TextFieldType = FieldType.Delimited,
  6.    .Delimiters = {","},
  7.    .HasFieldsEnclosedInQuotes = True
  8. }
  9.  
  10.    Do Until csvParser.EndOfData
  11.        Try
  12.            csvFields.Add(csvParser.ReadFields(0)) ' Campo 0.
  13.  
  14.        Catch ex As MalformedLineException
  15.            ' Linea con formato incorrecto...
  16.  
  17.        End Try
  18.    Loop
  19.  
  20. End Using
  21.  
  22. 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
« Última modificación: 21 Octubre 2015, 07:47 am por Eleкtro » En línea

Eliza_loaeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Recortar caracteres
« Respuesta #4 en: 21 Octubre 2015, 07:36 am »

disculpa.
si es el archivo que descarga por defecto twitter, de estas lineas solo intento sacar los puros comentarios y eliminar el resto.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recortar caracteres
« Respuesta #5 en: 21 Octubre 2015, 08:01 am »

de estas lineas solo intento sacar los puros comentarios y eliminar el resto.

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

Código
  1. Imports System.Web
  2.  
  3. Dim csvFilepath As String = "C:\file.csv"
  4.  
  5. Dim comments As IEnumerable(Of String) =
  6.    From line As String In File.ReadAllLines(csvFilepath, Encoding.UTF8)
  7.    Select HttpUtility.HtmlDecode(line.Split(","c)(5).Trim(ControlChars.Quote))
  8.  
  9. 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
« Última modificación: 21 Octubre 2015, 08:05 am por Eleкtro » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Recortar caracteres
« Respuesta #6 en: 21 Octubre 2015, 09:21 am »

A partir de ahora en VB voy a preguntar si es para VB6 o para VB.NET  :-\

Siempre pasa igual :(

Los primero y antes de nada pon código, así sabremos que lenguaje usas o bien especifique que es para VB.NET.


Pero 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.

Y también estoy 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:

Código:
Element Name,Windows NT,Windows,Windows CE,Win32s,Component,Component Version,Header File,Import Library,Unicode,Element Type
ADsBuildEnumerator,4.0 or later,,,,ADSI,,adshlp.h,,,function
ADsBuildVarArrayInt,4.0 or later,,,,ADSI,,adshlp.h,,,function
ADsBuildVarArrayStr,4.0 or later,,,,ADSI,,adshlp.h,,,function

Código:
Job #, goURL, Reason, Destination
10101, learn_ps_processraw_cz, Automation/Batch Processing, http://av.adobe.com/russellbrown/ImageProcessorSM.mov
10101, learn_ps_viewglyphsai_cz, Type, http://av.adobe.com/russellbrown/OpenTypeSM.mov
10101, learn_ps_cs5_gsindex_cz, Getting Started and tutorials link on homepage, http://www.adobe.com
10101, ps_cs5_plugins_mac_cz, Download page for optional plug-ins, http://www.adobe.com
10101, ps_cs5_plugins_win_cz, Download page for optional plug-ins, http://www.adobe.com
« Última modificación: 21 Octubre 2015, 09:41 am por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recortar caracteres
« Respuesta #7 en: 21 Octubre 2015, 10:04 am »

Pero 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
Código:
; 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.



estoy 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!
« Última modificación: 21 Octubre 2015, 10:15 am por Eleкtro » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Recortar caracteres
« Respuesta #8 en: 21 Octubre 2015, 10:20 am »

En cualquier caso el método par leerlo debe ser un equivalente al Input (debería haberlo), en VB6 pero desde VB.NET.

Si te fijas:
Código:
Element Name,Windows NT,Windows,Windows CE,Win32s,Component,Component Version,Header File,Import Library,Unicode,Element Type
ADsBuildEnumerator,4.0 or later,,,,ADSI,,adshlp.h,,,function

Aunque se vea desordenado sigue una lógica:
Código:
Dato1,Dato2,Dato3,Dato4,Dato5,...,Dato11

Donde ,,  es un espacio nulo es decir DatoX= ""

Y si su archivo lo muestra así:
Código:
"Dato1","Dato2","Dato3","Dato4","Dato5",...,"Dato11"

Viene a ser lo mismo.

Luego el sistema para leerlo debe ser similar al Input en VB.

Los archivos CSV que tengo yo, no son como los que pones de ejemplo. De hecho al abrirlo con el Excel se muestra todo en la misma columna tal cual como está en el archivo con comas y todo.

Por eso digo que debe haber varios formatos con misma extensión. Tengo clarísimo que los ejemplos que he puesto yo se han creado y se leen siguiendo un sistema similar al Input en VB6. Y por el ejemplo que ha puesto ella también deben ir por ahí los tiros.

Saludos


Utilizando el excel me he creado mi propio archivo
y se ha creado de la siguiente manera

Código:
1;124;9789
2;145;788
3;7878;65
4;9789;78
5;99;87
6;;88
7;788;7888
8;787;7
10;8;8

 En el Excel son 9 filas y 3 columnas.
Luego está claro que, todo depende del sistema para crear este tipo de archivo. como dices
Código:
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)

Yo creo que el de ella sigue un patrón IDÉNTICO al del Input en VB6 y no el Excel

Ya no lo doy más vueltas  :xD


« Última modificación: 21 Octubre 2015, 10:48 am por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recortar caracteres
« Respuesta #9 en: 21 Octubre 2015, 12:27 pm »

Por 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..



Luego 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
  1. Dim tokens As String() = <a>"hello",14,</a>.Value.Split({ControlChars.Cr, ControlChars.CrLf, ","c, ";"c}, StringSplitOptions.None)
  2.  
  3. For Each token As String In tokens
  4.    Console.WriteLine(token.Trim({ControlChars.Quote}))
  5. 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
  1. Using parser As TextFieldParser = My.Computer.FileSystem.OpenTextFieldParser("File.csv", {",", ";"})
  2.  
  3.    Do Until parser.EndOfData
  4.  
  5.        ' ...
  6.  
  7.    Loop
  8.  
  9. 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!
« Última modificación: 21 Octubre 2015, 12:41 pm por Eleкtro » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recortar imagenes
Diseño Gráfico
Superplay 9 3,855 Último mensaje 12 Agosto 2005, 10:59 am
por Superplay
recortar archivo .fla
Diseño Gráfico
Unnamed 2 4,653 Último mensaje 11 Septiembre 2008, 02:31 am
por Unnamed
recortar texto vb6
Programación Visual Basic
Psyke1 2 6,399 Último mensaje 28 Febrero 2010, 21:44 pm
por Psyke1
Alguien sabe buscar palabra de x caracteres y los demás caracteres a continuació
Programación Visual Basic
usuario oculto 3 5,006 Último mensaje 2 Agosto 2010, 18:36 pm
por Psyke1
Recortar número « 1 2 »
Programación Visual Basic
Psyke1 11 4,549 Último mensaje 12 Agosto 2010, 08:51 am
por Psyke1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines