hacer split y almacenarlo en una matriz en vb.net

Iniciado por Flamer, 15 Julio 2017, 21:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Flamer

hola quiero hacer una operacion con el comando split pero quiero que el resultado sea almacenado en una matriz ejemplo

tengo esta variable llamada cadena que es igual a

Código (vbnet) [Seleccionar]

dim cadena as string = "0-1-2-3-4-5-6-7-8-9"


y declaro una matriz de 1x10 así

Código (vbnet) [Seleccionar]

dim matriz(1,9) as string


quiero hacer split y que el resultado sea almacenado en la posicion 0 hasta 10 de la matriz sin hacer esto

Código (vbnet) [Seleccionar]

dim vector() as string

vector=split(cadena,"-")
for x=0 to 9
  matriz(0,x)=vector(x)
next


para que me entiendan quiero aguardar el vector en una fila de la matriz

Saludos Flamer y quiero ahorrarme el ciclo

Serapis

#1
No sé yo si entiendes la idea de 'bucle'.

La solución, pasa sí o sí, por hacer bucles. Otra cosa es que el bucle lo realices tú explícitamente o delegues en algún método interno.

Split, no entrega el contenido donde tu desees, si no en la posición de memoria de un array. Si quieres que Split, entregue el resultado en otro lado, tienes que manejar el puntero del array. Básicamente falsificando la dirección del array 'vector', para hacerle creer que su dirección es en realidad la dirección del índice en Matriz(0,0). Ahora bien, esto supone un problema irresoluble aquí... ya que Split, redimensiona automáticamente el array, pero al pasarle una dirección de array falsa, la estructura (SafeArray) del array (Matriz), no va a coincidir en nada con el de 'Vector', por lo que en algún punto va a cantar un error...

No hay buenas noticias para ti, que conste que en VB no existe solución a lo que tu esperas (ni en ningún lenguaje), porque exige sí o sí, redimensionar siempre el array en el que se vuelca, y si el array ya está redimensionado hacerlo de nuevo, sin duda borraría el contenido previo, pero puedes enfangarte y hacer algo...

Lo mejor es que ya que se requiere usar bucles (sí o sí), implementes tu propia función Split ... (aquí simplificada en parámetros)

Código (vbnet) [Seleccionar]

''' <summary>
''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en un array.
''' </summary>
''' <param name="Texto">El Texto origen del procesado</param>
''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
''' <returns>Un array con los resultados hallados.</returns>
''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
Public Function Split(ByRef Texto As String, Optional ByRef Delimitador As String = " ") As String()
       Dim cd() As String
       Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32

       ' Buscar cuantas coincidencias se localizan...
       While (k < Texto.Length)
           If Texto.Chars(k) = Delimitador Then
               ct1 += 1
           End If
           k += 1
       End While
               
       ReDim cd(0 To ct1)

       ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
       If (ct1 > 0) Then ' número de subdivisiones, si no se encontró, no recorremos de nuevo el texto...
           k = 0
           While (k < Texto.Length)
               If Texto.Chars(k) = Delimitador Then
                   cd(ct2) = Texto.Substring(n, k - n)
                   ct2 += 1 : n = k + 1
               End If
               k += 1
           End While
       End If
       ' queda la subcadena final, puede ser el texto original si no se encontró nada.
       cd(ct2) = Texto.Substring(n, k - n)

       Return cd
End Function


Bien, ahora que hay una función que opera conforme a como se espera (esto es casi igual que hace el Split de VB, digo casi, porque el delimitador aquí debe ser un solo carácter, queda a tu esfuerzo hacer los cambios necesarios que requieras), ahora puedes añadir una sobrecarga con la modificación que tu pedías...
...y hay un pero, bastante gordo... y es que tu array ya debe estar redimensionado y debe poder albergar todos los hallazgos que se encuentren, o generará error... obviamente esto conlleva a preguntar qué necesidad hay de hacer realmente esto, que no va a quedar en condiciones (no deja de ser un poco chapuza), y hace cuestionar lo más importante: ¿Para qué es necesario hacer esto?... porque seguramente existe una alternativa mucho más óptima y razonable, con la que no es posible contar al ignorar el propósito de para qué lo necesitas...

Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

...de todos modos, ya que he perdido el tiempo en ello, lo pongo... aquí el código de la modificación... pero fíjate en las 2 importantes limitaciones de esta 'solución': No puedes redimensionar el array, y el número de elementos de la dimensión final, debe poder alojar todos los hallazgos, o bien añadir un parámetro adicional (como tiene VB), para señalar cuántos elementos desean consignarse en el array (en VB un valor de -1, indica que todos los que haya)... nuevamente queda a tu esfuerzo cualquier cambio que necesites...

Código (vbnet) [Seleccionar]

''' <summary>
   ''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en la dimensión de un array YA ESTABLECIDO.
   ''' </summary>
   ''' <param name="Bolsa">Un array ya dimensionado a un tamaño útil.</param>
   ''' <param name="Dimension">El índice la dimensión donde se van a alojar.</param>
   ''' <param name="Texto">El Texto origen del procesado</param>
   ''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
   ''' <returns>El número de delimitadores hallados</returns>
   ''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
   Public Function Split(ByRef Bolsa(,) As String, ByVal Dimension As Integer, ByRef Texto As String, Optional ByRef Delimitador As String = " ") As Integer        
       Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32, d As Integer

       ' Buscar cuantas coincidencias se localizan...
       While (k < Texto.Length)
           If Texto.Chars(k) = Delimitador Then
               ct1 += 1
           End If
           k += 1
       End While

       ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
       If (ct1 > 0) Then ' si no se encontró, no recorremos de nuevo el texto...
           k = 0
           While (k < Texto.Length)
               If Texto.Chars(k) = Delimitador Then
                   Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)
                   ct2 += 1 : n = k + 1
               End If
               k += 1
           End While
       End If
       ' queda la subcadena final, puede ser el texto original si no se encontró nada.
       Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)

       Return ct2
End Function


Puede sprobar ambas funciones, por ejemplo con esto:
Código (vbnet) [Seleccionar]

       Dim s As String = "0-1---2-3-4-5-6-7-8-9-"  
       ' otros textos de prueba:"0-1-2-3-4-5-6-7-8-9", "0123456789"
       Dim cd() As String, sd(,) As String
       Dim n As Integer

       cd = Strings.Split(s, "-") ' el split de VB, para tras su ejecución y verifica si éste resultado coincide con el que devuelve la función cuyo código se ha creado...
       cd = Me.Split(s, "-")

       ReDim sd(0 To 2, 0 To 16)
       n = Me.Split(sd, 1, s, "-")
       n= n ' pon aquí un punto de parada (tecla F9) , y ejecuta hasta aquí, luego posa el ratón sobre 'sd' y baja a la flechita para ver el contenido del array con el intellisense


Y bueno, si nos cuentas para que los quieres se puede analizar una solución más óptima y acorde...

Incluso usando la función Split de VB, una vez obtenido el array podrías copiar el contenido (sin un bucle), nuevamente mediante el uso de punteros a memoria... la función de las API CopyMemory, vale perfectamente para ello, pero con Marshalling (bajo NET), evitarás la problemática de las API con la memoria administrada y no administrada....

p.d.: después de todo lo dicho, espero que reconsideres la opción de usar el bucle para asignarlo en tu array, aunque sea usando copymemory si no quieres usar un bucle (internamente en ensamblador, así se hará. Te guste o no, el bucle es inevitable).

Flamer

hola NEBIRE no me entendiste?


quiero hacer esto




sin un bucle for y si es posible meterlo ala matriz con el comando split

saludos Flamer

Eleкtro

#3
Cita de: Flamer en 15 Julio 2017, 21:19 PM
declaro una matriz de 1x10 así

Código (vbnet) [Seleccionar]

dim matriz(1,9) as string

En realidad eso no es 1x10, sino 2x10 (2 filas, 10 columnas). Ten presente que el índice siempre empieza por Cero para cualquier dimensión del Array e indexador en general ( collection(indexer) ).

Antes de proseguir con más explicaciones ...¿estás seguro de que no será esto lo que realmente pretendes lograr?:

Código (vbnet) [Seleccionar]
Dim str As String = "0-1-2-3-4-5-6-7-8-9"
Dim arr As Integer() = Array.ConvertAll(str.Split({"-"c}, StringSplitOptions.RemoveEmptyEntries), Function(s As String) Integer.Parse(s))


Es decir, partir una cadena de texto en base a un caracter delimitador, y transformar la secuencia de elementos resultantes en un Array unidimensional de enteros (una secuencia de diez elementos, arr(0) hasta arr(9)).

Me da la sensación de que eso es lo que en realidad quieres conseguir pero le diste demasiadas vueltas de tuerca innecesarias, por que básicamente la idea de construir un Array 2D con solo 1 índice o fila, tendrá practicamente el mismo efecto que si creases un array unidimensional ( Dim arr As Integer() = {1, 2, 3, etc...} ). A lo mejor me equivoco y realmente lo que pretendes es crear un Array 2D con más de 1 "fila", no lo se, simplemente te propongo la sugerencia de arriba por que yo no le encuentro sentido práctico alguno a hacer lo que estás haciendo en el ejemplo de código que has mostrado... pero puede que el código original no lo hayas mostrado y sea bien distinto (donde realmente si que necesites usar un array bidimensional), como ya digo, no lo sé.




¿Cual es el problema que le encuentras a tener que escribir tres miserables lineas para un búcle?; en la mayoría de los casos la escritura de un búcle es la forma más eficiente de que implementemos ciertos algoritmos (y en este caso, probablemente sea la única forma también). Si me dijeras que la escritura de ese búcle es una tarea repetitiva que debes escribir en otras partes del código fuente, pues aun te entendería, pero al parecer das a entender que solo lo tienes que escribir una única vez ese búcle en tu código fuente...
De todas formas si te incomoda tener que escribir tres lineas para un For, entonces siempre puedes decorar la lógica del algoritmo en una función rehutilizable de uso genérico para no tener que volver a escribirlo en el futuro nunca más y así optimizar tu productividad, por ejemplo de esta forma que he ideado para ti:

Código (vbnet) [Seleccionar]
<HideModuleName>
Public Module RectangularIndexedArrayExtensions ' Two dimensional indexed array extensions

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Fills the indices (or columns) of the specified index bound (or row) of the source array,
   ''' using the given collection of elements.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' The <see cref="Type"/> of the source array.
   ''' </typeparam>
   '''
   ''' <param name="sender">
   ''' The source array.
   ''' </param>
   '''
   ''' <param name="boundIndex">
   ''' The bound index (or row) of the first dimension in the source array.
   ''' </param>
   '''
   ''' <param name="collection">
   ''' A collection of elements to fill the indices (or columns) of the second dimension in the source array.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <exception cref="IndexOutOfRangeException">
   ''' The specified 'boundIndex' value is greater than the bounds of the first dimension in the source array.
   ''' or
   ''' The amount of elements in 'collection' is greater than the bounds of the second dimension in the source array.
   ''' </exception>
   ''' ----------------------------------------------------------------------------------------------------
   <Extension>
   Public Sub FillBounds(Of T)(ByRef sender As T(,), ByVal boundIndex As Integer, ByVal collection As T())

       Dim dim2Length As Integer = sender.GetLength(1)

       If (sender.GetUpperBound(0) < boundIndex) Then
           Throw New IndexOutOfRangeException(
               message:="The specified 'boundIndex' value is greater than the bounds of the first dimension in the source array.")
       End If

       If (dim2Length < collection.Count) Then
           Throw New IndexOutOfRangeException(
               message:="The amount of elements in 'collection' is greater than the bounds of the second dimension in the source array.")
       End If

       For i As Integer = 0 To (dim2Length - 1)
           sender(boundIndex, i) = collection(i)
       Next i

   End Sub

End Module


Modo de empleo:
Código (vbnet,1,2,3) [Seleccionar]
Dim str As String = "0-1-2-3-4-5-6-7-8-9"
Dim arr2D(0, 9) As String
arr2D.FillBounds(0, str.Split({"-"c}, StringSplitOptions.RemoveEmptyEntries))

For i As Integer = 0 To (arr2D.GetLength(1) - 1)
   Debug.WriteLine(arr2D(0, i))
Next


Flamer, en serio, yo te sugiero intentar no caer en el error o malos habitos de querer evitar la escritura de búcles como tal, eso son gilipolleces. Con la simplificación de código, en el sentido de los búcles, ganarás elegancia, reduciras la escritura de algunas lineas de código, pero al mismo tiempo perderás eficiencia (en terminos de velocidad de ejecución de código) y también las ventajas de poder realizar una correcta depuración de código con o sin breakpoints... por ejemplo al simplificar el bloque de código de un búcle de 5 lineas, a una consulta LINQ equivalente y de 1 linea.

Bueno, espero que el código de arriba te haya servido de ayuda, y con todo lo demás que ya te dijo el compañero @NEBIRE.

EDITO:
Cita de: Flamer en 16 Julio 2017, 02:38 AMNEBIRE no me entendiste?
Cita de: Flamer en 16 Julio 2017, 02:38 AMsin un bucle for
y si es posible meterlo ala matriz con el comando split

Disculpadme los dos por entrometerme en vuestra conversación, pero... Flamer, sinceramente a mi me parece que ni tan siquiera has llegado a leer el post de @NEBIRE... o el que no lo has entendido en todo caso eres tú, por que basicamente él te da respuesta y explicación detallada a todas esas dudas. Si yo fuese él, me cabrearía si alguien me respondiese lo que has respondido tú xD.

Saludos!








Flamer

si lei el comentario de el compañero NEBIRE pero no tiene nada que ver con lo que digo

y lo del bucle for no lo quiero hacer por que si son muchos elementos tardaría demasiado
y lo de la matriz ya se que es de 2x10 solo la quería para el ejemplo pero ahora te pondré una de 10x10  que se declara 9x9

lo que quiero hacer es sencillo tengo un string
Código (vbnet) [Seleccionar]

dim a as string ="0-1-2-3-4-5-6-7-8-9"


si hago split genero un array o vector (cosa que el vector no me interesa crear solo quiero meter el contenido de la string a ala matriz)

Código (vbnet) [Seleccionar]

dim v() as string
v =split(a,"-")


ahora como le hago para meter lo que contiene el array v a una matrix de (9,9) en una fila  como en la foto



tampoco quiero convertirlo a integer que es el código que me pusistes Elecktro

saludos Flamer y no es necesaria tanta explicación solo digan si me entienden para expresarme de otra manera

Eleкtro

#5
Cita de: Flamer en 16 Julio 2017, 04:20 AMahora como le hago para meter lo que contiene el array v a una matrix de (9,9) en una fila  como en la foto

Por mi parte ya he escrito y te he mostrado un código (en forma de extensión de método) que hace exactamente eso. ¿lo leiste?.

Cita de: Flamer en 16 Julio 2017, 04:20 AM
tampoco quiero convertirlo a integer que es el código que me pusistes Elecktro

Irrelevante. El primer código de ejemplo que te mostré, es eso, un ejemplo que puedes adaptar a tus necesidades, pero de todas formas en el ejemplo que deberías fijarte es en el segundo ejemplo que te mostré... con las tres primeras lineas resaltadas en otro color.

Saludos








Serapis

#6
Cita de: Flamer en 16 Julio 2017, 02:38 AM
hola NEBIRE no me entendiste?
claro que te entendí... el código y explicaciones que pusiste (y que repito aquí debajo) son suficientemente claro:
Código (vbnet) [Seleccionar]

' tengo esta variable llamada cadena que es igual a
dim cadena as string = "0-1-2-3-4-5-6-7-8-9"
' y declaro una matriz de 1x10 así
dim matriz(1,9) as string

' quiero hacer split y que el resultado sea almacenado en la posicion 0 hasta 10 de la matriz sin hacer esto
dim vector() as string

vector=split(cadena,"-")
for x=0 to 9
  matriz(0,x)=vector(x)
next

' ... quiero guardar el vector en una fila de la matriz ... y quiero ahorrarme el ciclo


Sin embargo, eres tú quien parece no haberme entendido...
Ningún lenguaje se dedica a crear funciones peregrinas para resolver un único caso que se va a usar 1 vez cada 5 años por parte de algún programador... máximo, cuando lo mismo puede hacerse con 3 líneas de código y para colmo a cambio de una complejidad extrema (sería preciso para que fuera útil del todo declarar que partes del array deberían mantenerse, lo que exigiría copias posteriores que lo harían lento).
Pero el principal problema por el que ningún lenguaje ha hecho ni hará jamás (salvo que lo formen chiflados), es crear una función cuyo resultado a priori se desconozca, y por tanto que deba crear y redimensionar un array y que en vez de ello, derive a un array administrado por 'el usuario', para volcar el contenido, pero antes redimensionarlo y J0D35L3 el contenido actual, o a cambio de una complejidad extrema donde declare que partes exigen ser mantenidas... y la función deba restaurar esas partes previas verificaciones de si el nuevo tamaño, lo va a permitir (ajustado a la perfeccción), si va a sobrtar contenido nuevo, o si se va a destruir contenido existente...

- Cuando vas a hacer Split, de entrada no sabes cuantas apariciones habrá, por eso en un primer momento han de contarse (si se quieren guardar en un array), para luego redimensionar el array a la cantidad encontrada y en otro paso volcar ahí los datos. Si en vez de un array se usara por ejemplo una lista enlazada, podría hacerse todo en un solo paso, pero la ventaja de los arrays recae en la contigüidad de sus elementos, y de ahí la facilidad de encontrar la dirección de memoria del elemento 'x'... y con ello la velocidad de acceso.

- Si tu tienes un array ya declarado con más de una dimensión, ese array ya está definido a tener 'x' dimensiones por 'y' elementos en cada dimensión (suponiendo uno de 2 dimensiones). Un Split, podría hacer una de dos cosas sobre un array así: Redimensionarlo de nuevo para que tenga el tamaño que encuentre el 'splitado', o bien usar el espacio actual que tenga el array no redimensionándolo en ningún caso y en tal situación que queden ocurrencias sin copia. ó indices sin una reocupación (con basura del contenido previo). ambas situaciones son una chapuza.... peroooooooooo... si ese es tu caso, YA te puse código para una función que hace eso, luego no vengas con que no te entendí.... prueba la función más arriba y dime si lo hace o no (que desde luego lo hace, porque la he probado).

- Pero el problema es que tu ya tienes ese array, en cambio Split, devuelve un array que Split crea. Split no admite (en ninguna sobrecarga) como parámetro de entrada un array tuyo donde volcar el contenido. Luego Split, no hace lo que tu pides (cierto es que no he probado aún VS-2017, pero dudo mucho que hagan eso ni ahora ni nunca. Es más si a alguien se le ocurriera tamaña patraña, creo que lo despidirían ese mismo día).

- Te decía también, que es posible tras obtener el array que devuelve split, volcar en contenido en tu array (sin usar un bucle), haciendo uso de Marshalling, para operar con punteros de dirección y hacer un: copyMemory(ptrDestino, ptrOrigen, NumBytesACopiar)...
...pero francamente el código necesario en NET para esto, es mucho más que las 3 PUT45 líneas sencillas de un bucle (en vb6 sería solo la línea de código de la llamada a la función, pero en NET al operar con memoria administrada se requiere más código aunque luego compilado no difiera mucho).

- Y en cuanto a la velocidad de copia, creo que estás subestimando los procesadores.... trata de hacer pruebas de velocidad de asignación entre bucles y demuéstrame que es lento, dime cuantos millones de índices por segundo es capaz de transferir tu equipo entre 2 arrays... sin conocer nada de tu equipo, apuesto que más de 20millones por segundo, así que tu aseveración de que 'es lento' es pueril e injustificada.

---------
p.d.: En programación se puede hacer cualquier cosa, pero eso no significa que sea admisible hacer cualquier cosa, hay aberraciones y esta que propones (por no usar un bucle) es una de ellas. Francamente eso dice muy poco a tu favor como programador...

Desde el momento en que se deba realojar memoria para copiar datos y deba modificarse una infinidad y la complejidad lo haga costoso, será relativamente más sencillo proveer una array adicional que se crea en el momento preciso y se destruye cuando ya no se requiera, y se deje el resto 'en paz'.... en general esta ecuación suele ser casi siempre cierta: Mayor sencillez = mayor velocidad.

En fin si no entiendes todo esto que te digo, es que tu madurez como programador aún está muy verde...

Flamer

bueno gracias a los dos por quererme ayudar pero yo desde un principio conocía la respuesta, pero solo preguntaba por si se podía pero párese que les gusta escribir mucho y sin llegar a nada

pero solo bastaba con decir "no se puede por esto y esto", eso aclararía todo ahora yo les digo por que no se puede

primero la solución a este problema es crear una matriz escalonada cosa que ninguno de los dos menciono como el siguiente ejemplo:

Código (vbnet) [Seleccionar]

Dim m(1)() As String ' le puse solo 1 para el ejemplo pero le podia a ver puesto 10 o 100
Dim cadena As String = "0-1-2-3-4-5-6-7-8-9"

m(0) = Split(cadena, "-")

MsgBox(m(0)(1))



con esto tenemos los valores del string dentro de una matriz

ahora el problema es que una matriz escalonada no me sirve ya que si quiero imprimirla en un archivo binario los bytes no son impresos a como yo quiero, hay surge otro problema

asi que la solucion es tener que aguardar los datos en una matriz mutidimencional la cual al imprimirla en un archivo binario los datos si son aguardados correctamente

pero ahora surge otro problema si los valores del string son demasiados, con demasiados me refiero a millones de dígitos separados por el guion, hasta llegar al limite de una variable string

una matriz escalonado si me almacena aun que sean millones de dígitos así como lo mostré en el ejemplo anterior pero no me sirve, cosa que una matriz multidimensional no hace

y si los quiero pasar a una matriz multidimensional seria necesario 2 ciclos for uno anidado para recorrer la matriz, pero el problema es de que son muchos dígitos y un ciclo tardaría una inmensidad para pasar todos los valores

asi que no se puede pasar ya que las matrices son posiciones de memoria y a fuerzas se tienen que ir recorriendo para ir pasando los valores

saludos Flamer y yo solo preguntaba a un que ya conocía la respuesta

Serapis

Cita de: Flamer en 16 Julio 2017, 20:43 PM
bueno gracias a los dos por quererme ayudar pero yo desde un principio conocía la respuesta, pero solo preguntaba por si se podía pero párese que les gusta escribir mucho y sin llegar a nada
Vaya... es que eres duro de mollera. Se te ha explicado de todas las maneras posibles y sigues sin entenderlo. Y eso de llegar a nada, lo siento, solucion se te ha dado, otra cosa es que tu desistas de usarlas...

Cita de: Flamer en 16 Julio 2017, 20:43 PM
pero solo bastaba con decir "no se puede por esto y esto", eso aclararía todo ahora yo les digo por que no se puede
Eso es lo que se ha dicho una y otra vez... y no que no se pueda si no que las soluciones no son eficaces.


Cita de: Flamer en 16 Julio 2017, 20:43 PM
primero la solución a este problema es crear una matriz escalonada cosa que ninguno de los dos menciono como el siguiente ejemplo:
FALSO. Ya te comenté eso, otra cosa es que en tu ignorancia no sepas verlo...
Cita de: NEBIRE en 16 Julio 2017, 01:49 AM
Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

Tu problema más elemental se traduce en que no aclaras (ni aún a estas alturas), para que rayos necesitas hacer eso, porque es fijo que hay una manera óptima de tratar los datos, pero tu te cierras en banda en querer usar un array mutidimensional porque sí, y solo si... (y además sin usar un bucle para volcarlo). Es como si alguien dice que quiere ir a la Luna, y contrata a una empresa aeroespacial, pero al final resulta que "quiere ir con su motocicleta y no admite ninguna otra cosa". Pues va a ser que así solo irás al pueblito de al lado o a otra ciudad... pero jamás a la Luna.

Si quieres y realmente lo necesitas, explica como tienes los datos en ¿el fichero?, y explica pará que vas a usarlos y por tanto qué datos son precisos y olvida la parte de cómo o de qué manera hay que tratarlo, eso ya se te aclara... deja abierto que te sugieran como tratar los datos, no te obceques en querer hacer algo de una manera específica. Es seguro que hay mucha maneras de hacerlo óptimo, pero 'usando tu moto, forzosamente', nadie se va a comprometer a que sea óptimo...

Flamer

Citar
Tu problema más elemental se traduce en que no aclaras (ni aún a estas alturas), para que rayos necesitas hacer eso, porque es fijo que hay una manera óptima de tratar los datos, pero tu te cierras en banda en querer usar un array mutidimensional porque sí, y solo si...

ya te dije se imprime diferente en un archivo binario

y los códigos que mostraste usas una función split, la cual recorres el string con un ciclo while
por eso te dije que  no me avías  entendido

y si te preguntas por que sin ciclos pues es por que tardarían mucho y por que por que estoy manejando muchos valores de millones en millones

solo espera va que me dijeran que sin ciclos no se puede, eso es todo

saludos Flamer y si en eso de duro de entender no te equivocas jajajaja