Hola.
tengo un problema con arrays en vb.net, tengo 12 array que contendrán distintos datos que luego escribo en un archivo xml, el problema es que no todos los arrays contendrán datos o no todos tendrán el mismo número de datos y eso me genera problemas.
lo que necesito o quisiera hacer es llenar de ceros los que tengan menos datos e igual con los que no tengan ningún dato.
lo que tengo hasta el memento es lo siguiente:
Do While tmp1 <= var1.Length
If var2(tmp1) = Nothing Then
var2(tmp1) = 0
End If
If var3(tmp1) = Nothing Then
var3(tmp1) = 0
End If
If var4(tmp1) = Nothing Then
var4(tmp1) = 0
End If
If var5(tmp1) = Nothing Then
var5(tmp1) = 0
End If
If var6(tmp1) = Nothing Then
var6(tmp1) = 0
End If
If var7(tmp1) = Nothing Then
var7(tmp1) = 0
End If
If var8(tmp1) = Nothing Then
var8(tmp1) = 0
End If
If var9(tmp1) = Nothing Then
var9(tmp1) = 0
End If
If var10(tmp1) = Nothing Then
var10(tmp1) = 0
End If
If var11(tmp1) = Nothing Then
var11(tmp1) = 0
End If
If var12(tmp1) = Nothing Then
var12(tmp1) = 0
End If
tmp1 += 1
Loop
Estoy convencido de que lo que estás intentando hacer, llenar con ceros, no es la solución más adecuada y debe ser causa de un problema que viene detrás.
Muestra las declaraciones de dichos Arrays, de la variable tmp1, y el método de escritura que te genera problemas, explica el problema que tienes un poco más a fondo para poder proponerte el enfoque adecuado.
De todas formas, ten en cuenta que puedes inicializar el Array al declararlo, de la siguiente manera por ejemplo:
Dim arr1 As Integer() = Enumerable.Repeat(Of Integer)(element:=-1, count:=10).ToArray()
Eso podría evitar los problemas de elementos nulos que comentas y que no sabemos exactamente por qué tienes ese problema.
Saludos
Dim var1 As Array = Form1.TextBox1.Lines
Dim var2 As Array = Form1.TextBox4.Lines
Dim var3 As Array = Form1.TextBox6.Lines
Dim var4 As Array = Form1.TextBox8.Lines
Dim var5 As Array = Form1.TextBox16.Lines
Dim var6 As Array = Form1.TextBox14.Lines
Dim var7 As Array = Form1.TextBox12.Lines
Dim var8 As Array = Form1.TextBox10.Lines
Dim var9 As Array = Form1.TextBox24.Lines
Dim var10 As Array = Form1.TextBox22.Lines
Dim var11 As Array = Form1.TextBox20.Lines
Dim var12 As Array = Form1.TextBox18.Lines
No puedo inicializar el array porque no se cuantos datos va a contener y necesito que todos lleven la misma cantidad de datos respetando lo que ya se ha puesto en los cajones de texto.
mas adelante hago lo siguiente:
Do While i <= var1.Length
c1 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c2 = <a><![CDATA[<]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
c3 = <a><![CDATA[<p>]]></a>.Value & var1(i) & <a><![CDATA[</p>]]></a>.Value
c4 = <a><![CDATA[</]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
c5 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c6 = <a><![CDATA[<]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
c7 = <a><![CDATA[<p>]]></a>.Value & var2(i) & <a><![CDATA[</p>]]></a>.Value
c8 = <a><![CDATA[</]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
i += 1
Loop
no soy programador así que lo que hago es bastante tosco.
Dejo el link del proyecto el que dice "copia" es la versión que funcionaba pero solo con una variable.
El proyecto genera la base de datos, para datos variables de Illustrator CC.
Buenas
Lamento decirte que absolutamente todo es inapropiado en el código, empezando por los tipos que estás utilizando (Array) cómo la masiva repetición de código (...¿49 variables para lo mismo?...), la manera de iterar un array, el intento de asignar un valor a un elemento inexistente fuera del rango del Array, y por último la construcción "manual" del documento XML, donde podrías utilizar classes específicas para ello cómo XmlWriter.
El motivo que das de no ser programador no me sirve cómo justificación, puesto que, aparte de estar programando, conoces y sabes utilizar un loop (aunque sea de tipo While) :¬¬.
El problema con el primer código que mostraste es que estás intentando asignar un valor a un elemento inexistente del Array, al intentar acceder al índice obviamente esto causa una excepción de índice fuera de rango.
De la forma en que pretendías corregir ese problema (llenando con Ceros) primero deberías haber inicializado un Array adicional (es decir, 12 Arrays adicionales más) con más espacio (más elementos) y copiar el contenido de uno a otro Array, algo que sin duda sería bastante engorroso,
en lugar de Arrays podrías haber utilizado listas genéricas y así utilizar el método List.Add() para añadir elementos "vacíos", pero eso tampoco me parece una solución apropiada, ya que no solo los Arrays del código suponen un problema, sino todo lo demás, por ese motivo te sugiero que vuelvas a re-escribir todo lo que tienes hecho para generar un código ausente de problemas.
Te ayudaría a corregirlo y simplificar todo mostrándote un código con un enfoque distinto, pero no entiendo muy bien lo que pretendes hacer con esos 12 TextBoxes (¿por qué no son 11 o 13 por ejemplo?)...
Prueba a empezar por eliminar todo esto:
Dim c1 As String
Dim c2 As String
Dim c3 As String
Dim c4 As String
Dim c5 As String
Dim c6 As String
Dim c7 As String
Dim c8 As String
Dim c9 As String
Dim c10 As String
Dim c11 As String
Dim c12 As String
Dim c13 As String
Dim c14 As String
Dim c15 As String
Dim c16 As String
Dim c17 As String
Dim c18 As String
Dim c19 As String
Dim c20 As String
Dim c21 As String
Dim c22 As String
Dim c23 As String
Dim c24 As String
Dim c25 As String
Dim c26 As String
Dim c27 As String
Dim c28 As String
Dim c29 As String
Dim c30 As String
Dim c31 As String
Dim c32 As String
Dim c33 As String
Dim c34 As String
Dim c35 As String
Dim c36 As String
Dim c37 As String
Dim c38 As String
Dim c39 As String
Dim c40 As String
Dim c41 As String
Dim c42 As String
Dim c43 As String
Dim c44 As String
Dim c45 As String
Dim c46 As String
Dim c47 As String
Dim c48 As String
Dim c49 As String
Do While tmp1 <= var1.Length
If var2(tmp1) = Nothing Then
var2(tmp1) = 0
End If
If var3(tmp1) = Nothing Then
var3(tmp1) = 0
End If
If var4(tmp1) = Nothing Then
var4(tmp1) = 0
End If
If var5(tmp1) = Nothing Then
var5(tmp1) = 0
End If
If var6(tmp1) = Nothing Then
var6(tmp1) = 0
End If
If var7(tmp1) = Nothing Then
var7(tmp1) = 0
End If
If var8(tmp1) = Nothing Then
var8(tmp1) = 0
End If
If var9(tmp1) = Nothing Then
var9(tmp1) = 0
End If
If var10(tmp1) = Nothing Then
var10(tmp1) = 0
End If
If var11(tmp1) = Nothing Then
var11(tmp1) = 0
End If
If var12(tmp1) = Nothing Then
var12(tmp1) = 0
End If
tmp1 += 1
Loop
Do While i <= var1.Length
c1 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c2 = <a><![CDATA[<]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
c3 = <a><![CDATA[<p>]]></a>.Value & var1(i) & <a><![CDATA[</p>]]></a>.Value
c4 = <a><![CDATA[</]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
c5 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c6 = <a><![CDATA[<]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
c7 = <a><![CDATA[<p>]]></a>.Value & var2(i) & <a><![CDATA[</p>]]></a>.Value
c8 = <a><![CDATA[</]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
c9 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c10 = <a><![CDATA[<]]></a>.Value & nombre3 & <a><![CDATA[>]]></a>.Value
c11 = <a><![CDATA[<p>]]></a>.Value & var3(i) & <a><![CDATA[</p>]]></a>.Value
c12 = <a><![CDATA[</]]></a>.Value & nombre3 & <a><![CDATA[>]]></a>.Value
c13 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c14 = <a><![CDATA[<]]></a>.Value & nombre4 & <a><![CDATA[>]]></a>.Value
c15 = <a><![CDATA[<p>]]></a>.Value & var4(i) & <a><![CDATA[</p>]]></a>.Value
c16 = <a><![CDATA[</]]></a>.Value & nombre4 & <a><![CDATA[>]]></a>.Value
c17 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c18 = <a><![CDATA[<]]></a>.Value & nombre5 & <a><![CDATA[>]]></a>.Value
c19 = <a><![CDATA[<p>]]></a>.Value & var5(i) & <a><![CDATA[</p>]]></a>.Value
c20 = <a><![CDATA[</]]></a>.Value & nombre5 & <a><![CDATA[>]]></a>.Value
c21 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c22 = <a><![CDATA[<]]></a>.Value & nombre6 & <a><![CDATA[>]]></a>.Value
c23 = <a><![CDATA[<p>]]></a>.Value & var6(i) & <a><![CDATA[</p>]]></a>.Value
c24 = <a><![CDATA[</]]></a>.Value & nombre6 & <a><![CDATA[>]]></a>.Value
c25 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c26 = <a><![CDATA[<]]></a>.Value & nombre7 & <a><![CDATA[>]]></a>.Value
c27 = <a><![CDATA[<p>]]></a>.Value & var7(i) & <a><![CDATA[</p>]]></a>.Value
c28 = <a><![CDATA[</]]></a>.Value & nombre7 & <a><![CDATA[>]]></a>.Value
c29 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c30 = <a><![CDATA[<]]></a>.Value & nombre8 & <a><![CDATA[>]]></a>.Value
c31 = <a><![CDATA[<p>]]></a>.Value & var8(i) & <a><![CDATA[</p>]]></a>.Value
c32 = <a><![CDATA[</]]></a>.Value & nombre8 & <a><![CDATA[>]]></a>.Value
c33 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c34 = <a><![CDATA[<]]></a>.Value & nombre9 & <a><![CDATA[>]]></a>.Value
c35 = <a><![CDATA[<p>]]></a>.Value & var9(i) & <a><![CDATA[</p>]]></a>.Value
c36 = <a><![CDATA[</]]></a>.Value & nombre9 & <a><![CDATA[>]]></a>.Value
c37 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c38 = <a><![CDATA[<]]></a>.Value & nombre10 & <a><![CDATA[>]]></a>.Value
c39 = <a><![CDATA[<p>]]></a>.Value & var10(i) & <a><![CDATA[</p>]]></a>.Value
c40 = <a><![CDATA[</]]></a>.Value & nombre10 & <a><![CDATA[>]]></a>.Value
c41 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c42 = <a><![CDATA[<]]></a>.Value & nombre11 & <a><![CDATA[>]]></a>.Value
c43 = <a><![CDATA[<p>]]></a>.Value & var11(i) & <a><![CDATA[</p>]]></a>.Value
c44 = <a><![CDATA[</]]></a>.Value & nombre11 & <a><![CDATA[>]]></a>.Value
c45 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
c46 = <a><![CDATA[<]]></a>.Value & nombre12 & <a><![CDATA[>]]></a>.Value
c47 = <a><![CDATA[<p>]]></a>.Value & var12(i) & <a><![CDATA[</p>]]></a>.Value
c48 = <a><![CDATA[</]]></a>.Value & nombre12 & <a><![CDATA[>]]></a>.Value
c49 = <a><![CDATA[</v:sampleDataSet>]]></a>.Value
Cuerpo_xml = Cuerpo_xml & vbCrLf & c1 & vbCrLf & c2 & vbCrLf & c3 & vbCrLf & c4 & vbCrLf & c5 & _
vbCrLf & c6 & vbCrLf & c7 & vbCrLf & c8 & vbCrLf & c9 & vbCrLf & c10 & _
vbCrLf & c11 & vbCrLf & c12 & vbCrLf & c13 & vbCrLf & c14 & vbCrLf & c15 & _
vbCrLf & c16 & vbCrLf & c17 & vbCrLf & c18 & vbCrLf & c19 & vbCrLf & c20 & _
vbCrLf & c21 & vbCrLf & c22 & vbCrLf & c23 & vbCrLf & c24 & vbCrLf & c25 & _
vbCrLf & c26 & vbCrLf & c27 & vbCrLf & c28 & vbCrLf & c29 & vbCrLf & c30 & _
vbCrLf & c31 & vbCrLf & c32 & vbCrLf & c33 & vbCrLf & c34 & vbCrLf & c35 & _
vbCrLf & c36 & vbCrLf & c37 & vbCrLf & c38 & vbCrLf & c39 & vbCrLf & c40 & _
vbCrLf & c41 & vbCrLf & c42 & vbCrLf & c43 & vbCrLf & c44 & vbCrLf & c45 & _
vbCrLf & c46 & vbCrLf & c47 & vbCrLf & c48 & vbCrLf & c49 & vbCrLf
i += 1
Loop
Y reemplaza todo ese código eliminado por un loop que itere los elementos de cada array, podría ser algo cómo esto (no se si produce el formato que deseas):
Dim arrays As IEnumerable(Of Array) =
{
var1, var2, var3,
var4, var5, var6,
var7, var8, var9,
var10, var11, var12
}
Dim count As Integer = 0
Dim sb As New System.Text.StringBuilder
With sb
For Each arr As Array In arrays
For Each value As String In arr
count += 1
.AppendLine(String.Format("<v:sampleDataSet dataSetName=""datos {0}"">", CStr(count)))
.AppendLine(String.Format("<{0}>", nombre1))
.AppendLine(String.Format("<p>{0}</p>", value))
.AppendLine(String.Format("</{0}>", nombre1))
.AppendLine()
Next value
Next arr
End With
Dim xmlText As String = Me.cuerpo_xml & sb.ToString & Me.fin_xml
Saludos!
Este es el resultado:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets xmlns="&ns_vars;">
<variableSet varSetName="binding1" locked="none">
<variables><variable varName="num" trait="textcontent" category="&ns_flows;"></variable><variable varName="let" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable></variables>
<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/"><v:sampleDataSet dataSetName="datos 1">
<num>
<p>1</p>
</num>
<v:sampleDataSet dataSetName="datos 2">
<num>
<p>2</p>
</num>
<v:sampleDataSet dataSetName="datos 3">
<num>
<p>3</p>
</num>
<v:sampleDataSet dataSetName="datos 4">
<num>
<p>a</p>
</num>
<v:sampleDataSet dataSetName="datos 5">
<num>
<p>b</p>
</num>
<v:sampleDataSet dataSetName="datos 6">
<num>
<p>c</p>
</num>
</v:sampleDataSets>
</variableSet>
</variableSets>
</svg>
Esto es lo que yo necesito:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets xmlns="&ns_vars;">
<variableSet locked="none" varSetName="binding1">
<variables>
<variable category="&ns_flows;" varName="Variable1" trait="textcontent"></variable>
<variable category="&ns_flows;" varName="Variable2" trait="textcontent"></variable>
</variables>
<v:sampleDataSets xmlns:v="&ns_vars;" xmlns="&ns_custom;">
<v:sampleDataSet dataSetName="Conj. de datos 1">
<Variable1>
<p>1</p>
</Variable1>
<Variable2>
<p>a</p>
</Variable2>
</v:sampleDataSet>
<v:sampleDataSet dataSetName="Conj. de datos 2">
<Variable1>
<p>2</p>
</Variable1>
<Variable2>
<p>b</p>
</Variable2>
</v:sampleDataSet>
<v:sampleDataSet dataSetName="Conj. de datos 3">
<Variable1>
<p>3</p>
</Variable1>
<Variable2>
<p>c</p>
</Variable2>
</v:sampleDataSet>
</v:sampleDataSets>
</variableSet>
</variableSets>
</svg>
El código ya no da problemas con los array, con respecto a los textbox no importa que fueran 20 o 50 entre más mejor. Y te reitero que no soy programador del código que pusiste que resuelve el problema de los array pero que no es valido en Adobe Illustrator no entiendo nada por eso no puedo arreglarlo.
Mi único problema son los array porque el xml que genero con mis 49 variables es valido.
Yo entiendo y se que mi código es pésimo, pero es lo que entiendo.
Muchas gracias por tu ayuda.
Solucionado:
If var2.Length < var1.Length Then
For index = var2.Length To var1.Length
ReDim Preserve var2(UBound(var2) + 1)
var2(UBound(var2)) = 0
Next
End If
If var3.Length < var1.Length Then
For index = var3.Length To var1.Length
ReDim Preserve var3(UBound(var3) + 1)
var3(UBound(var3)) = 0
Next
End If
If var4.Length < var1.Length Then
For index = var4.Length To var1.Length
ReDim Preserve var4(UBound(var4) + 1)
var4(UBound(var4)) = 0
Next
End If
If var5.Length < var1.Length Then
For index = var5.Length To var1.Length
ReDim Preserve var5(UBound(var5) + 1)
var5(UBound(var5)) = 0
Next
End If
If var6.Length < var1.Length Then
For index = var6.Length To var1.Length
ReDim Preserve var6(UBound(var6) + 1)
var6(UBound(var6)) = 0
Next
End If
If var7.Length < var1.Length Then
For index = var7.Length To var1.Length
ReDim Preserve var7(UBound(var7) + 1)
var7(UBound(var7)) = 0
Next
End If
If var8.Length < var1.Length Then
For index = var8.Length To var1.Length
ReDim Preserve var8(UBound(var8) + 1)
var8(UBound(var8)) = 0
Next
End If
If var9.Length < var1.Length Then
For index = var9.Length To var1.Length
ReDim Preserve var9(UBound(var9) + 1)
var9(UBound(var9)) = 0
Next
End If
If var10.Length < var1.Length Then
For index = var10.Length To var1.Length
ReDim Preserve var10(UBound(var10) + 1)
var10(UBound(var10)) = 0
Next
End If
If var11.Length < var1.Length Then
For index = var11.Length To var1.Length
ReDim Preserve var11(UBound(var11) + 1)
var11(UBound(var11)) = 0
Next
End If
If var12.Length < var1.Length Then
For index = var12.Length To var1.Length
ReDim Preserve var12(UBound(var12) + 1)
var12(UBound(var12)) = 0
Next
End If