Hoy tenia que importar unos .csv para un programa que estoy haciendo de fichas de ayuda al turista y sucedía que unas veces los archivos estaban separados por comas, otras por punto y coma y otras por tabulador.
Así que decidí hacer una función para que ella solita se "apiole" de cual era el carácter en cuestión.
Public Function ChkSeparator(strPath As String) As Collection ''Dado un archivo de texto separado por comas, tabuladores etc. esta funcion analiza cual es el caracter separador. Para ello comprueba todos los caracteres ascii y para cada linea y si estan en todas la lineas luego los lista. una vez que se tiene el conjunto de caracteres que estan en todos los renglones se pasa a contar la ocurrencias de cada uno en cada linea y en cuanto algun caracter aparece diferente cantidad de veces en dos lineas distintas este se descarta.
Dim str As String
Dim stx As New String[]
Dim c As Byte
Dim n As Integer
Dim i As Integer
Dim col As New Collection
stx = FileLoad(strPath)
If stx.Count >= 10 Then
n = 9
Else
n = stx.Max
Endif
For c = 0 To 64
Select c
Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
'skip
Case Else
col.Add(0, Chr(c))
For i = 0 To n
If InStr(stx[i], Chr(c)) = 0 Then
col[Chr(c)] = Null
Break
Else
col[Chr(c)] = col[Chr(c)] + 1
Endif
Next
End Select
Next
' Aca faltaria una verificación de misma cantidad de veces en todos los renglones
Return col
End
Dim str As String
Dim stx As New String[]
Dim c As Byte
Dim n As Integer
Dim i As Integer
Dim col As New Collection
stx = FileLoad(strPath)
If stx.Count >= 10 Then
n = 9
Else
n = stx.Max
Endif
For c = 0 To 64
Select c
Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
'skip
Case Else
col.Add(0, Chr(c))
For i = 0 To n
If InStr(stx[i], Chr(c)) = 0 Then
col[Chr(c)] = Null
Break
Else
col[Chr(c)] = col[Chr(c)] + 1
Endif
Next
End Select
Next
' Aca faltaria una verificación de misma cantidad de veces en todos los renglones
Return col
End
Faltaria una verificación mas. en caso que sea un separador este caracter debera ocurrir la misma cantidad de veces en todos los renglones
Utiliza una función auxiliar que carga y depura el archivo CSV antes de pasarlo al procesado.
Public Function FileLoad(strPath As String, Optional bolBL As Boolean) As String[] ''Devuelve una matriz de texto donde cada ítem es un renglón del archivo de texto. Si el renglón esta vacio en el archivo de texto, es decir se trata de unallinea vacia, esta no se pasa a la martiz, por lo tanto el resultado es un retorno sin lineaas en blanco.
Dim strList As String
Dim stxListTmp As New String[]
Dim stxList As New String[]
Dim intList As Integer
stxList.Clear
If Exist(strPath) Then
strList = File.Load(strPath)
If InStr(strList, "\n") > -1 Then
stxListTmp = Split(strList, "\n")
Else
If String.Len(strList) > 0 Then
stxListTmp.Add(strList)
Endif
Endif
For intList = 0 To stxListTmp.Max
Select bolBL
Case False
If stxListTmp[intList] <> "" Then
stxList.Add(stxListTmp[intList])
Endif
Case Else
stxList.Add(stxListTmp[intList])
End Select
Next
Endif
Return stxList
End
Dim strList As String
Dim stxListTmp As New String[]
Dim stxList As New String[]
Dim intList As Integer
stxList.Clear
If Exist(strPath) Then
strList = File.Load(strPath)
If InStr(strList, "\n") > -1 Then
stxListTmp = Split(strList, "\n")
Else
If String.Len(strList) > 0 Then
stxListTmp.Add(strList)
Endif
Endif
For intList = 0 To stxListTmp.Max
Select bolBL
Case False
If stxListTmp[intList] <> "" Then
stxList.Add(stxListTmp[intList])
Endif
Case Else
stxList.Add(stxListTmp[intList])
End Select
Next
Endif
Return stxList
End
Bueno el resultado es una lista de los posibles separadores. En todas las prueba que hice sale solo un carácter, pero podría suceder que salgan varios. Me interesa que le echen un vistazo para mejorarla.
¿Alguna función para contar las veces que un carácter dado aparece en una cadena de texto?
Saludos.