entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

La matriz de entrada es más larga que el número de columnas en esta tabla

Hola

DE un archivo texto separado por comas, exportado de SQL server2012 se esta tratando de cargar a un datagrid

pero el error que me sale es este

La matriz de entrada es más larga que el número de columnas en esta tabla

el codigo que utilice fue este:

public void importaRegistros(string archivoSelec)
        {

            DataTable dt = new DataTable();
            using (System.IO.TextReader tr = File.OpenText(archivoSelec))
            {
                string line;
                while ((line = tr.ReadLine()) != null)
                {

                    string[] items = line.Trim().Split(',');
                    if (dt.Columns.Count == 0)
                    {
                        for (int i = 0; i < items.Length; i++)
                            dt.Columns.Add(new DataColumn("Column" + i, typeof(string)));
                    }
                    dt.Rows.Add(items);

                }
                this.dgListado.DataSource = dt;
            }

        }

y la falla resuta en dt.Rows.add(items).... hay alguna posibilidad si una linea es mas grande de lo normal evitar escribir esta???

Javi2EE comentado Ene 28, 2016

Seria muy raro que un archivo exportado a csv tenga diferente numero de columnas en funcion de la fila, has comprobado que en el archivo csv no haya cadenas de texto que incluyan una coma??

german comentado Ene 28, 2016

no, no tienen!!! pero como pudiera comprobar si lo importo a excel se carga perfectamente, son 13mil registros

Javi2EE comentado Ene 28, 2016

Excel no fallaría en ese caso porque las cadenas de texto van entre "" y excel lo tiene en cuenta, en tu algoritmo no se evitan las cadenas de texto por eso pensaba que era el fallo.

2 Respuestas

1voto

carlossevi Puntos61050

Puedes empezar sustituyendo esto:

dt.Rows.Add(items);

Por esto:

if (items.Count == dt.Columns.Count)
{
    dt.Rows.Add(items);
}
else
{
    // Controla aquí la excepción
}

2votos

Leonardo-Tadei Puntos216110

Hola @german,

el error parece estar acá:

for (int i = 0; i < items.Length; i++)

Si el vector tuviera, por ejemplo, 10 elementos, la longitud devuelta será 10, pero al numerarse desde cero, lo tenés que recorrer del 0 al 9, es decir, hasta longitud-1:

for (int i = 0; i < items.Length-1; i++)

Probalo y contanos!

Javi2EE comentado Ene 28, 2016

Creo que el bucle esta bien, al tener i < items.Length con el signo menor no llega al 10, se recorre del 0 al 9.

Leonardo-Tadei comentado Ene 28, 2016

Tenés razon! El bucle debería parar uno antes. Vi mal el operador.

De curioso pregunto: lo probaste?

Otra pregunta: si el archivo CSV tiene, por ejemplo, 10 renglones: funciona o falla?

german comentado Ene 29, 2016

gracias leonardo!! con 10 reglones funciona... el CSV de prueba es de 13220 lineas y a javi2EE en la excepcion coloque que muestre las lineas para que se corrijan por el usuario. ;)

Leonardo-Tadei comentado Ene 29, 2016

Qué bueno!

Es habitual que en lotes grandes haya alguna incompatibilidad en el formato, y por eso te sugería que pruebes tu código con una muestra menor.

Luego, si el código está bien y la importación falla, la solución que @carlossevi te indica te ayuda a discriminar las líneas que están bien de las que no.

Saludos cordiales!

german comentado Feb 1, 2016

hola leonardo tenias razon primero utilice una importacion pequeña de unos 10 luego 200 registro cuando incremente el numero de registro me fallo con la importacion de fechas, o mejor yo subo el lote al dataTable sin ningun problema pero al momento de hacer un insert a la base de datos me falla con algunas fechas, he consultado la libreria filehelpers que me tipea los datos importar pero me pone muchos problemas... sabes de alguna otra alternativa???

Leonardo-Tadei comentado Feb 1, 2016

Hola @german,

primero, identificá las filas que te dan problemas para ver qué tienen y así decidir la acción a seguir.

Si la línea tiene incongruencias o datos sin sentido, debería descartarla completa.

Si la línea tiene algún dato con el separador de campo y por tanto para el parser tiene una columna de más, deberías descartarla o reveer cómo se genera el archivo de exportación.

Si la línea tiene solo un error en la fecha, corregir solo la fecha. Lo que yo siempre hago es un verificador de fechas propio, para poder manejar el error en caso de que se produzca... una fecha es lo suficientemente simple para analizarla a mano en unas pocas líneas.

Si pudieras poner por aćá una línea correcta y una incorrecta para compararla, seguro te podríamos ayudar mejor.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta