Tenemos un archivo de
entrada de tipo JSON y deseamos un listado de ciertas columnas, en este caso
están marcadas con la etiqueta de comienzo de “operaciones” (marcada en rojo) :
{
"
settings
": {
"
campo0 ": ""
"
}
"
mappings
": {
"
operaciones
": {
" campo1 ": "",
" campo2 ": "",
...
}
}
}
leemos el archivo .json
Dim objStreamReader As StreamReader
Dim path2 As String = "C:\jose
Pedro\Proyectos\JSON\ArchivoPrueba.json"
objStreamReader = New StreamReader(path2)
Para recorrer todo el
archivo JSON debemos conocer el número de filas que tiene, para ello lo
calculamos del siguiente modo
'Lee el número de filas del archivo JSON
Dim
LongFichero As
Long
If
File.ReadAllLines(path2).Length
> 0 Then
LongFichero = File.ReadAllLines(path2).Length.ToString()
End If
Y ahora lo recorremos
con un for
Dim j As Integer
For
j = 0 To
LongFichero
Next
Dentro del for llemos
el archivo .JSON con las instrucciones
'Lee el archivo linea por
línea.
strLine =
objStreamReader.ReadLine
strLine = Trim(strLine)
Para eliminar los Tabs
del archivo hacemos esto
'elimina los Tab del comienzo de las
cadenas
Dim SearchvbTab As String = ControlChars.Tab
Dim vbTabCharacter As Integer =
strLine.IndexOf(SearchvbTab)
While
strLine.IndexOf(SearchvbTab) <> -1
strLine =
strLine.Remove(vbTabCharacter, 1)
End While
Para que comience a
escribir sólo cuando encuentre la palabra clave hacemos esto.
Dim entra As Boolean
'solo comienza a escribir cuando
encuentra la palabra Operaciones
Dim FirstCharacter As Integer =
strLine.IndexOf(SearchOperaciones)
If FirstCharacter <> -1 Then
entra = True
End If
La grabación del nuevo
archivo con el listado se hace con estas líneas
strLine
= strLine.Remove(SecondCharacter - 5)
Dim
info As
Byte() = New UTF8Encoding(True).GetBytes(strLine
& vbCrLf)
fs.Write(info,
0, info.Length)
Hemos detectado que los
campos que deseamos listar tienen todos una llave de apertura “{“ en su línea
por lo que descartamos todo excepto las líneas que contengan la llave de
apertura “{“
Dim SearchForThis As String = "{"
Dim
SecondCharacter As
Integer =
strLine.IndexOf(SearchForThis)
If SecondCharacter <> -1 And entra = True Then
End if
Pero hay campos que no
deben aparecer pues son genéricos de JSON pero como también llevan la llave de
apertura, no los discrimina y salen, para evitarlo los listamos en un array
para que si los encuentra no los escriba.
Dim KeyWords() As String = {"fields", "operaciones", "properties", "raw"}
For
Each Item As String In KeyWords
Dim EncuentraClave As Integer = strLine.IndexOf(Item)
If EncuentraClave <> -1 Then
graba = False
Exit For 'si la encuentra debe salir
inmediatamente
Else
graba = True
End If
Next
Finalmente muestro el
código completo
Private Sub ParsearJSON()
Dim
objStreamReader As
StreamReader
Dim strLine As String
'Pass the file
path and the file name to the StreamReader constructor.
Dim path2 As String = "C:\jose
Pedro\Proyectos\JSON\ArchivoPrueba.json"
Dim path As String = "C:\jose
Pedro\Proyectos\JSON\ArchivoSalida.txt"
objStreamReader = New StreamReader(path2)
' Create or
overwrite the file.
Dim fs As FileStream = File.Create(path)
Dim SearchForThis As String = "{"
Dim
SearchOperaciones As String = "operaciones"
Dim SearchvbTab As String = ControlChars.Tab
Dim KeyWords() As String = {"fields", "operaciones", "properties", "raw"}
Dim PalabraClave As String
Dim j As Integer
Dim entra As Boolean
Dim graba As Boolean
entra = False
PalabraClave = ""
'Read the first
line of text.
strLine
= objStreamReader.ReadLine
'Lee el número de filas del
archivo JSON
Dim
LongFichero As
Long
If File.ReadAllLines(path2).Length
> 0 Then
LongFichero = File.ReadAllLines(path2).Length.ToString()
End If
For j = 0 To LongFichero
'Write the line
to the Console window.
Console.WriteLine(strLine)
'Read the next
line.
strLine = objStreamReader.ReadLine
strLine = Trim(strLine)
'elimina los Tab del comienzo de las cadenas
Dim vbTabCharacter As Integer = strLine.IndexOf(SearchvbTab)
While
strLine.IndexOf(SearchvbTab) <> -1
strLine =
strLine.Remove(vbTabCharacter, 1)
End While
'solo comienza a escribir cuando encuentra la palabra
Operaciones
Dim FirstCharacter As Integer =
strLine.IndexOf(SearchOperaciones)
If FirstCharacter
<> -1 Then
entra = True
End If
Dim SecondCharacter As Integer =
strLine.IndexOf(SearchForThis)
If SecondCharacter
<> -1 And
entra = True
Then
Dim EncuentraClave As Integer = strLine.IndexOf(Item)
If EncuentraClave <> -1 Then
graba = False
Exit For 'si la
encuentra debe salir inmediatamente
Else
graba = True
End If
Next
If graba Then
strLine =
strLine.Remove(SecondCharacter - 5)
Dim info As Byte() = New UTF8Encoding(True).GetBytes(strLine
& vbCrLf)
fs.Write(info, 0,
info.Length)
End If
End If
Next
'Close the files.
fs.Close()
objStreamReader.Close()
Console.ReadLine()
MsgBox("parseo terminado
correctamente")
End Sub
El archivo de salida
será de este estilo
campo1
campo2
campo3
..
..
campo n
No hay comentarios:
Publicar un comentario