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???

0voto

Javi2EE comentado

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??

0voto

german comentado

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

0voto

Javi2EE comentado

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 Puntos63580

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 Puntos227320

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!

0voto

Javi2EE comentado

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.

0voto

Leonardo-Tadei comentado

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?

0voto

german comentado

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. ;)

0voto

Leonardo-Tadei comentado

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!

0voto

german comentado

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???

0voto

Leonardo-Tadei comentado

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.

Otras Preguntas y Respuestas


...

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

Conecta