none
Insertar varias fila en un datatable

    Pregunta

  • hola como estan espero que bien, le comento estoy armando un datatableb para colocarlo en en  un Datagridview pero me imprime  una sola linea de unas 1000 lineas.el codigo es este

    En el datatable recoge los datos de dos list  uno llamado datoscab (que son los datos de cabecera y otro datos(datos reales), pero logro imprimir una sola fila, pero siempre me muestra una , esto  lo imprime linealmente.

    Si me pueden dar ideas o ayudarme se lo agradeceria mucho

    Nos vemos


            private void pasardatatable() 
            {
    
                DataRow fila;
                fila = dt.NewRow();
    
                for (int i = 0; i < datoscab.Count; i++)
                {
    
                    dt.Columns.Add(datoscab[i].ToString(), typeof(string));
    
                }
    
    
                for (int i = 0; i < datos.Count; i++)
                {
                    try
                    {
    
                        fila[datoscab[i].ToString()] = datos[i].ToString();
                        dt.Rows.Add(fila);
                    }
                    catch (Exception ex)
                    {
                        lbl_numfila.Text = "Error: " + ex.Message;
                    }


    Una respuesta JP


    • Editado jpgrover domingo, 9 de septiembre de 2018 18:49
    domingo, 9 de septiembre de 2018 18:47

Respuestas

  • Buenas,

    Esto seguramente sea debido a que signas el mismo datarow al datatable, prueba asi:

            private void pasardatatable() 
            {
    
                DataRow fila;
                
    
                for (int i = 0; i < datoscab.Count; i++)
                {
    
                    dt.Columns.Add(datoscab[i].ToString(), typeof(string));
    
                }
    
    
                for (int i = 0; i < datos.Count; i++)
                {
                    try
                    {
                        fila = dt.NewRow();
                        fila[datoscab[i].ToString()] = datos[i].ToString();
                        dt.Rows.Add(fila);
                    }
                    catch (Exception ex)
                    {
                        lbl_numfila.Text = "Error: " + ex.Message;
                    }

    En cada iteracion, se esta asignando una nueva referencia.

    Nos comentas el resultado

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta jpgrover domingo, 9 de septiembre de 2018 22:01
    • Desmarcado como respuesta jpgrover domingo, 9 de septiembre de 2018 22:01
    • Marcado como respuesta Pablo RubioModerator miércoles, 12 de septiembre de 2018 16:37
    domingo, 9 de septiembre de 2018 18:55
  • Buenas jp,

    No entiendo que quieres hacer exactamente...

    veo datos "embarullados" pero no veo un patrón claro de que hacer con ellos, podrías poner un ejemplo concreto con unos pocos datos (dos o tres filas) y como te gustaría que se viesen?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 9 de septiembre de 2018 22:23
  • Jorge lo que pasa  que es un  documento txt que da una sonda submarina y hay que ordenarlo asi te envio fot, primero abro el archivo. por cada linea que tengo la longitud lo paso por un switch y obtengo los datos y cabecera y despues lo monto en un datatable y lo muestro despues quiero imprimirlo en un reportview asi deberia quedar


    Una respuesta JP


    • Editado jpgrover domingo, 9 de septiembre de 2018 22:43
    • Marcado como respuesta Pablo RubioModerator miércoles, 12 de septiembre de 2018 16:37
    domingo, 9 de septiembre de 2018 22:41
  • Okey,

    Mañana me pongo con ello que es tarde en españa.... xD

    Te importaría pasarme el txt, o copiarme las primeras lineas para poder probar yo a ver como hacerlo?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 9 de septiembre de 2018 23:12
  • ok te explico en la segunda linea esta el id en primer lugar y despues viene la fecha y la hora

    3197 18 11 30 08 04 2018

    te copio dos de los datos996 20806 17710 21326
    3197 18 11 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 114
       73.67       28        7        0
       75.65        2        0        0
       77.63       -4       -5        0
       79.61        5       -9        0
       81.59       15       -1        0
       83.57        0       11        0
       85.55       -1       16        0
       87.53       13        4        0
       89.51        3       10        0
       91.49        3       31        0
       93.47       17       28        0
       95.45       21        6        0
       97.43       18        9        0
       99.41        2        0       10
      101.39       -5      -13       13
      103.37        3      -20       10
      105.35        6      -33        7
      107.33        0      -25        0
      109.31        0      -26        0
      111.29       -4      -29       -6
      113.27       -4      -18       -8
      115.25       -6       -9       -5
      117.23       -6       -8        0
      119.21       -8       -5       -5
      121.19        0      -15        0
      123.17        6      -11        0
      125.15      -19       -5        9
      127.13      -33       11       12
      129.11      -10       13        0
      131.09       -9       32        0
      133.07      -23       27       14
      135.05        2       47        0
      137.03       -5      -17        8
      139.01       35        7       -7
      140.99       11      -37        2
      142.97       32      -53        4
      144.95        0        0        0
      146.93        0        0        0


    8996 20806 17710 21326
    3198 18 21 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 117
       73.67        0        9        5
       75.65      -16        2        0
       77.63       -1       -8        0
       79.61       20       -9        0
       81.59       25       12       -2
       83.57        4       40        0
       85.55      -22       42       -5
       87.53      -29       32       -9
       89.51      -17       16       -3
       91.49      -18        9        0
       93.47      -22       16       -7
       95.45      -15       23      -10
       97.43      -17       37       -8
       99.41      -14       24       -7
      101.39      -10        5       -5
      103.37      -16        3       -4
      105.35      -20        8       -8
      107.33      -19       21       -7
      109.31      -25       27        0
      111.29      -14       32        0
      113.27      -12       24        0
      115.25      -20       13        0
      117.23      -16        1        3
      119.21      -11       22        5
      121.19       -9       48        7
      123.17      -22       46        0
      125.15      -21       34        0
      127.13        0       33        0
      129.11        1       50        0
      131.09       27       49        0
      133.07       53       26        2
      135.05       20       52        0
      137.03       31       29      -11
      139.01       33       -3      -18
      140.99       17       -5       -8
      142.97      -52       18       -7
      144.95        0        0        0
      146.93        0        0        0

    te hago recuerdo que la primera columna pueden ser mas o menos.

    y yo solamente me falta imprimir la segunda linea

    Gracias


    Una respuesta JP

    domingo, 9 de septiembre de 2018 23:27
  • Buenas,

    Después de un rato, he tendría algo que creo que te puede valer:

    DataTable ParseData(string filePath)
    {
      DataTable dt = new DataTable();
      Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
      var lineas = File.ReadAllLines(filePath);
    
      int lineasRegistro = 0;
      //Obtengo el numero de lineas por registro
      for (int i = 3; i < lineas.Length; i++)
      {
        if (regNumber.Matches(lineas[i]).Count > 4) //Cuando la fila tienes mas de 4 numeros, es la lineade la fecha
        {
          lineasRegistro = i - 1; //Por lo tanto, es i - 1 suponiendo que no hay lineas en blanco 
          break;
        }
      }
    
      //Calculo el numero de registros en base al numero de lineas
      int numeroRegistros = lineas.Length / lineasRegistro;
    
      //generamos los headers de la tabla
      dt.Columns.Add("Registro");
      dt.Columns.Add("Dia");
      dt.Columns.Add("Hora");
      foreach (var item in lineas.Skip(3).Take(lineasRegistro - 3)) //Hago skip para saltarme las 3 que no dan datos
      {
        var header = regNumber.Matches(item)[0].Groups[1].Value;
        dt.Columns.Add(header); //Hago un split para separarlos y me quedo con el primero, que es el header
      }
      //Hago una iteracion por cada registro
      for (int i = 0; i < numeroRegistros; i++)
      {
        //Obtenemos el array de la linea 2, que es donde deduzco vienen los datos que quieres
        var datosRegistro = lineas[lineasRegistro * i + 1].Split(' '); //Utilizo la linea 2 de cada registro, por eso lineasRegistro*i + 1
        var id = datosRegistro[0];
        var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
        //Llenamos la tabla
        DataRow dr = dt.NewRow();
        dr[0] = id;
        dr[1] = fecha.ToString("dd/MM/yyyy");
        dr[2] = fecha.ToString("HH:mm:ss");
    
        int columna = 3;
    
        //Hago un skip de el registro anterior, selecciono tantas como lineas por registro hay, y me salto las 3 primeras que no aportan datos
        foreach (var item in lineas.Skip(lineasRegistro * i).Take(lineasRegistro).Skip(3))
        {
          var valor = regNumber.Matches(item)[1].Groups[1].Value; //Obtenemos el primer numero mediante regex
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
        }
        dt.Rows.Add(dr);
      }
      return dt;
    }

    Simplemente para usarla tendrías que hacer algo así:

    dataGridView1.DataSource = ParseData("tu ficehro");

    Para que eso funcione bien, he supuesto que el fichero de datos es 1 solo, donde vienen todos los datos sin lineas blancas entre medias, es decir, algo asi:

    996 20806 17710 21326 
    3197 18 11 30 08 04 2018 9.8 18.2 256 198 70 70 0 0 
    13381 114 
       73.67       28        7        0 
       75.65        2        0        0 
       77.63       -4       -5        0 
       79.61        5       -9        0 
       81.59       15       -1        0 
       83.57        0       11        0 
       85.55       -1       16        0 
       87.53       13        4        0 
       89.51        3       10        0 
       91.49        3       31        0 
       93.47       17       28        0 
       95.45       21        6        0 
       97.43       18        9        0 
       99.41        2        0       10 
      101.39       -5      -13       13 
      103.37        3      -20       10 
      105.35        6      -33        7 
      107.33        0      -25        0 
      109.31        0      -26        0 
      111.29       -4      -29       -6 
      113.27       -4      -18       -8 
      115.25       -6       -9       -5 
      117.23       -6       -8        0 
      119.21       -8       -5       -5 
      121.19        0      -15        0 
      123.17        6      -11        0 
      125.15      -19       -5        9 
      127.13      -33       11       12 
      129.11      -10       13        0 
      131.09       -9       32        0 
      133.07      -23       27       14 
      135.05        2       47        0 
      137.03       -5      -17        8 
      139.01       35        7       -7 
      140.99       11      -37        2 
      142.97       32      -53        4 
      144.95        0        0        0 
      146.93        0        0        0
    8996 20806 17710 21326 
    3198 18 21 30 08 04 2018 9.8 18.2 256 198 70 70 0 0 
    13381 117 
       73.67        0        9        5 
       75.65      -16        2        0 
       77.63       -1       -8        0 
       79.61       20       -9        0 
       81.59       25       12       -2 
       83.57        4       40        0 
       85.55      -22       42       -5 
       87.53      -29       32       -9 
       89.51      -17       16       -3 
       91.49      -18        9        0 
       93.47      -22       16       -7 
       95.45      -15       23      -10 
       97.43      -17       37       -8 
       99.41      -14       24       -7 
      101.39      -10        5       -5 
      103.37      -16        3       -4 
      105.35      -20        8       -8 
      107.33      -19       21       -7 
      109.31      -25       27        0 
      111.29      -14       32        0 
      113.27      -12       24        0 
      115.25      -20       13        0 
      117.23      -16        1        3 
      119.21      -11       22        5 
      121.19       -9       48        7 
      123.17      -22       46        0 
      125.15      -21       34        0 
      127.13        0       33        0 
      129.11        1       50        0 
      131.09       27       49        0 
      133.07       53       26        2 
      135.05       20       52        0 
      137.03       31       29      -11 
      139.01       33       -3      -18 
      140.99       17       -5       -8 
      142.97      -52       18       -7 
      144.95        0        0        0 
      146.93        0        0        0

    Me genera esta salida:

    El tema esta cogido con pinzas suponiendo varias cosas que no tienen porque ser así... Podrías confirmarme si el sensor genera solo 1 fichero o un fichero por registro? Podrías confirmarme el formato de el fichero para poder ajustar el código?

    Quedo a la espera de respuesta

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.


    lunes, 10 de septiembre de 2018 18:14
  • Todo ok pero se debe registrar las 4 columnas, la primera es el header la segunda columna  es el primer registro del, la tercera columna es el segundo registro y el cuarto columna es el tercer registro, algo asi Jorge 

    Registro        fecha           hora         70.63  70.63  70.63  71.25  71.25 71.25 

      31450    30/2/2018     18:00:32        23       4         0        0        -5      9

    esos registro es la profundidad, la velocidad de desenso, la recistencia velocidad vertical y la resistencia del agua,por ende aunque sea 0 el registro igual deberia ir 

    voy a tratar de arreglarlo  gracias

    despues pasarlo a excel 


    Una respuesta JP

    martes, 11 de septiembre de 2018 13:46
  • Comprendo...

    Dejame que haga unos cambios y en un rato te pongo algo.

    En principio entiendo que lo que he asumido del formato del txt es correcto y esa parte te funciona no? el unico problema que hay ahora es mostrar los 3 datos y no solo 1?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    martes, 11 de septiembre de 2018 15:29
  • Bueno, el cambio ha sido facil:

    DataTable ParseData(string filePath)
    {
      DataTable dt = new DataTable();
      Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
      var lineas = File.ReadAllLines(filePath);
    
      int lineasRegistro = 0;
      //Obtengo el numero de lineas por registro
      for (int i = 3; i < lineas.Length; i++)
      {
        if (regNumber.Matches(lineas[i]).Count > 4) //Cuando la fila tienes mas de 4 numeros, es la lineade la fecha
        {
          lineasRegistro = i - 1; //Por lo tanto, es i - 1 suponiendo que no hay lineas en blanco 
          break;
        }
      }
    
      //Calculo el numero de registros en base al numero de lineas
      int numeroRegistros = lineas.Length / lineasRegistro;
    
      //generamos los headers de la tabla
      dt.Columns.Add("Registro");
      dt.Columns.Add("Dia");
      dt.Columns.Add("Hora");
      foreach (var item in lineas.Skip(3).Take(lineasRegistro - 3)) //Hago skip para saltarme las 3 que no dan datos
      {
        var header = regNumber.Matches(item)[0].Groups[1].Value;
        //Hago un split para separarlos y me quedo con el primero, que es el header, despues añado el (X)
        dt.Columns.Add(header + "(1)"); 
        dt.Columns.Add(header + "(2)"); 
        dt.Columns.Add(header + "(3)"); 
      }
      //Hago una iteracion por cada registro
      for (int i = 0; i < numeroRegistros; i++)
      {
        //Obtenemos el array de la linea 2, que es donde deduzco vienen los datos que quieres
        var datosRegistro = lineas[lineasRegistro * i + 1].Split(' '); //Utilizo la linea 2 de cada registro, por eso lineasRegistro*i + 1
        var id = datosRegistro[0];
        var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
        //Llenamos la tabla
        DataRow dr = dt.NewRow();
        dr[0] = id;
        dr[1] = fecha.ToString("dd/MM/yyyy");
        dr[2] = fecha.ToString("HH:mm:ss");
    
        int columna = 3;
    
        //Hago un skip de el registro anterior, selecciono tantas como lineas por registro hay, y me salto las 3 primeras que no aportan datos
        foreach (var item in lineas.Skip(lineasRegistro * i).Take(lineasRegistro).Skip(3))
        {
          var matches = regNumber.Matches(item); //Obtenemos los match del regex
          var valor = matches[1].Groups[1].Value; //Obtenemos el primer numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
          valor = matches[2].Groups[1].Value; //Obtenemos el segundo numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
          valor = matches[3].Groups[1].Value; //Obtenemos el tercer numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
        }
        dt.Rows.Add(dr);
      }
      return dt;
    }

    Si te fijas, he cambiado la parte de generación de los headers para añadir 3 veces cada dato con (1), (2), (3) y en la parte de rellenar, he cambiado un poco para hacer 1 regex, y utilizar cada match para rellenar la columna apropiada.

    Ya me comentaras si es lo que necesitabas

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta jpgrover viernes, 14 de septiembre de 2018 1:27
    martes, 11 de septiembre de 2018 15:42

Todas las respuestas

  • Buenas,

    Esto seguramente sea debido a que signas el mismo datarow al datatable, prueba asi:

            private void pasardatatable() 
            {
    
                DataRow fila;
                
    
                for (int i = 0; i < datoscab.Count; i++)
                {
    
                    dt.Columns.Add(datoscab[i].ToString(), typeof(string));
    
                }
    
    
                for (int i = 0; i < datos.Count; i++)
                {
                    try
                    {
                        fila = dt.NewRow();
                        fila[datoscab[i].ToString()] = datos[i].ToString();
                        dt.Rows.Add(fila);
                    }
                    catch (Exception ex)
                    {
                        lbl_numfila.Text = "Error: " + ex.Message;
                    }

    En cada iteracion, se esta asignando una nueva referencia.

    Nos comentas el resultado

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta jpgrover domingo, 9 de septiembre de 2018 22:01
    • Desmarcado como respuesta jpgrover domingo, 9 de septiembre de 2018 22:01
    • Marcado como respuesta Pablo RubioModerator miércoles, 12 de septiembre de 2018 16:37
    domingo, 9 de septiembre de 2018 18:55
  • Mira esto resulto, mmmm que se puede hacer, te explico si ves a lado izquierdo tengo un texto eso debo ordenarlo son 1224 lectura y son 3 lectura  que se requiere y necesita que el la priomera columna sea la cabecera y las 3 seria los datos.



    te dejo lo que tengo hasta el momento


    te envio los codigos son 39 registros, pero esos registros son dinamicos.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    
    namespace leery_arrglar
    {
        public partial class _2 : Form
        {
            DataTable dt = new DataTable();
            List<string> datos = new List<string>();
            List<string> datoscab = new List<string>();
            string ruta = "", dia = "", hora = "", c = "";
            string linea = "";
            string linea2 = "";
            int cant = 0, h = 0, m = 0, s = 0, d = 0, mm = 0, y = 0, cont = 0;
            decimal c2 = 0, c3 = 0, c4 = 0, band = 1;
            string c1;
    
            public _2()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                leer(openFileDialog1);
            }
    
            private void leer(OpenFileDialog ofd)
            {
    
                ofd.InitialDirectory = @"c:\temp\";
                ofd.Filter = "Texto txt (*.txt)|*.TXT";
                ofd.FilterIndex = 2;
                ofd.RestoreDirectory = true;
    
                if ((ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK))
                {
                    ruta = ofd.FileName;
                }
                try
                {
                    using (StreamReader lector = new StreamReader(ruta))
                    {
                        while (lector.Peek() > 1)
                        {
                            linea = lector.ReadLine();
                            if (!String.IsNullOrEmpty(linea))
                            {
                                string[] palabras = linea.Split(' ');
                                linea2 = linea2 + Environment.NewLine + linea;
                                cant = Convert.ToInt32(palabras.Length);
                                c = c + " " + cant.ToString();
                                cont++;
                                switch (cant)
                                {
                                    case 16:
                                        fecha_hora(palabras);
                                        band++;
                                        break;
    
                                    case 24:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    case 25:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    case 26:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    case 27:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    case 28:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    case 29:
                                        cabecera_primerlinea(palabras);
                                        ln2(palabras);
                                        ln3(palabras);
                                        ln4(palabras, cant);
                                        break;
    
                                    default:
                                        break;
    
    
    
                                }
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    lbl_numfila.Text = "Error: " + ex.Message;
                }
                txt_texto.Text = linea2.ToString();
                datos.ToString();
                datoscab.ToString();
                pasardatatable();
                dgv_salida.DataSource = dt;
    
            }
    
            private void fecha_hora(string[] palabras)
            {
                string ds = "Dia", hr = "Hora", rg = "Registro";
                h = Convert.ToInt32(palabras[1].ToString());
                m = Convert.ToInt32(palabras[2].ToString());
                s = Convert.ToInt32(palabras[3].ToString());
                d = Convert.ToInt32(palabras[4].ToString());
                mm = Convert.ToInt32(palabras[5].ToString());
                y = Convert.ToInt32(palabras[6].ToString());
                dia = d + "/" + mm + "/" + y;
                hora = h + ":" + m + ":" + s;
    
                if (band > 1)
                {
    
                    datos.Add(palabras[0].ToString());
                    datos.Add(dia);
                    datos.Add(hora);
                }
                else
                {
                    datoscab.Add(rg);
                    datoscab.Add(ds);
                    datoscab.Add(hr);
                    datos.Add(palabras[0].ToString());
                    datos.Add(dia);
                    datos.Add(hora);
                }
            }
    
            private void cabecera_primerlinea(string[] palabras)
            {
                int inicio = 0;
                int fin = 6;
                if (band > 2)
                {
                    for (int i = inicio; i < fin; i++)
                    {
                        if (palabras[i].ToString() == "")
                        {
    
                        }
                        else
                        {
                            for (int j = 0; j < 3; j++)
                            {
                                c1 = palabras[i].ToString() + "(" + j + ")";
                                datoscab.Add(c1.ToString());
                            }
    
                        }
                    }
                }
    
            }
    
            private void ln2(string[] palabras)
            {
                int inicio = 7;
                int fin = 12;
                for (int i = inicio; i < fin; i++)
                {
                    if (palabras[i].ToString() == "")
                    {
    
                    }
                    else
                    {
                        c2 = Convert.ToDecimal(palabras[i].ToString());
                        datos.Add(c2.ToString());
                    }
                }
    
            }
    
            private void ln3(string[] palabras)
            {
                int inicio = 13;
                int fin = 20;
                for (int i = inicio; i < fin; i++)
                {
                    if (palabras[i].ToString() == "")
                    {
    
                    }
                    else
                    {
                        c3 = Convert.ToDecimal(palabras[i].ToString());
                        datos.Add(c3.ToString());
                    }
                }
    
            }
    
            private void ln4(string[] palabras, int cant)
            {
                int inicio = 21;
                int fin = palabras.Length;
                for (int i = inicio; i < fin; i++)
                {
                    if (palabras[i].ToString() == "")
                    {
    
                    }
                    else
                    {
                        c4 = Convert.ToDecimal(palabras[i].ToString());
                        datos.Add(c4.ToString());
                    }
                }
    
            }
    
            private void pasardatatable()
            {
    
                DataRow fila;
                fila = dt.NewRow();
    
                for (int i = 0; i < datoscab.Count; i++)
                {
    
                    dt.Columns.Add(datoscab[i].ToString(), typeof(string));
    
                }
    
    
                for (int i = 0; i < datos.Count; i++)
                {
                    try
                    {
                       
                        fila[datoscab[i].ToString()] = datos[i].ToString();
                        dt.Rows.Add(fila);
                    }
                    catch (Exception ex)
                    {
                        lbl_numfila.Text = "Error: " + ex.Message;
                    }
                }
                
    
                //dgv_salida.Rows.Add(fila);
    
    
    
            }
        }
    }



    Una respuesta JP


    • Editado jpgrover domingo, 9 de septiembre de 2018 22:21
    domingo, 9 de septiembre de 2018 22:17
  • Buenas jp,

    No entiendo que quieres hacer exactamente...

    veo datos "embarullados" pero no veo un patrón claro de que hacer con ellos, podrías poner un ejemplo concreto con unos pocos datos (dos o tres filas) y como te gustaría que se viesen?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 9 de septiembre de 2018 22:23
  • Jorge lo que pasa  que es un  documento txt que da una sonda submarina y hay que ordenarlo asi te envio fot, primero abro el archivo. por cada linea que tengo la longitud lo paso por un switch y obtengo los datos y cabecera y despues lo monto en un datatable y lo muestro despues quiero imprimirlo en un reportview asi deberia quedar


    Una respuesta JP


    • Editado jpgrover domingo, 9 de septiembre de 2018 22:43
    • Marcado como respuesta Pablo RubioModerator miércoles, 12 de septiembre de 2018 16:37
    domingo, 9 de septiembre de 2018 22:41
  • Okey,

    Mañana me pongo con ello que es tarde en españa.... xD

    Te importaría pasarme el txt, o copiarme las primeras lineas para poder probar yo a ver como hacerlo?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 9 de septiembre de 2018 23:12
  • ok te explico en la segunda linea esta el id en primer lugar y despues viene la fecha y la hora

    3197 18 11 30 08 04 2018

    te copio dos de los datos996 20806 17710 21326
    3197 18 11 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 114
       73.67       28        7        0
       75.65        2        0        0
       77.63       -4       -5        0
       79.61        5       -9        0
       81.59       15       -1        0
       83.57        0       11        0
       85.55       -1       16        0
       87.53       13        4        0
       89.51        3       10        0
       91.49        3       31        0
       93.47       17       28        0
       95.45       21        6        0
       97.43       18        9        0
       99.41        2        0       10
      101.39       -5      -13       13
      103.37        3      -20       10
      105.35        6      -33        7
      107.33        0      -25        0
      109.31        0      -26        0
      111.29       -4      -29       -6
      113.27       -4      -18       -8
      115.25       -6       -9       -5
      117.23       -6       -8        0
      119.21       -8       -5       -5
      121.19        0      -15        0
      123.17        6      -11        0
      125.15      -19       -5        9
      127.13      -33       11       12
      129.11      -10       13        0
      131.09       -9       32        0
      133.07      -23       27       14
      135.05        2       47        0
      137.03       -5      -17        8
      139.01       35        7       -7
      140.99       11      -37        2
      142.97       32      -53        4
      144.95        0        0        0
      146.93        0        0        0


    8996 20806 17710 21326
    3198 18 21 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 117
       73.67        0        9        5
       75.65      -16        2        0
       77.63       -1       -8        0
       79.61       20       -9        0
       81.59       25       12       -2
       83.57        4       40        0
       85.55      -22       42       -5
       87.53      -29       32       -9
       89.51      -17       16       -3
       91.49      -18        9        0
       93.47      -22       16       -7
       95.45      -15       23      -10
       97.43      -17       37       -8
       99.41      -14       24       -7
      101.39      -10        5       -5
      103.37      -16        3       -4
      105.35      -20        8       -8
      107.33      -19       21       -7
      109.31      -25       27        0
      111.29      -14       32        0
      113.27      -12       24        0
      115.25      -20       13        0
      117.23      -16        1        3
      119.21      -11       22        5
      121.19       -9       48        7
      123.17      -22       46        0
      125.15      -21       34        0
      127.13        0       33        0
      129.11        1       50        0
      131.09       27       49        0
      133.07       53       26        2
      135.05       20       52        0
      137.03       31       29      -11
      139.01       33       -3      -18
      140.99       17       -5       -8
      142.97      -52       18       -7
      144.95        0        0        0
      146.93        0        0        0

    te hago recuerdo que la primera columna pueden ser mas o menos.

    y yo solamente me falta imprimir la segunda linea

    Gracias


    Una respuesta JP

    domingo, 9 de septiembre de 2018 23:27
  • Buenas,

    Después de un rato, he tendría algo que creo que te puede valer:

    DataTable ParseData(string filePath)
    {
      DataTable dt = new DataTable();
      Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
      var lineas = File.ReadAllLines(filePath);
    
      int lineasRegistro = 0;
      //Obtengo el numero de lineas por registro
      for (int i = 3; i < lineas.Length; i++)
      {
        if (regNumber.Matches(lineas[i]).Count > 4) //Cuando la fila tienes mas de 4 numeros, es la lineade la fecha
        {
          lineasRegistro = i - 1; //Por lo tanto, es i - 1 suponiendo que no hay lineas en blanco 
          break;
        }
      }
    
      //Calculo el numero de registros en base al numero de lineas
      int numeroRegistros = lineas.Length / lineasRegistro;
    
      //generamos los headers de la tabla
      dt.Columns.Add("Registro");
      dt.Columns.Add("Dia");
      dt.Columns.Add("Hora");
      foreach (var item in lineas.Skip(3).Take(lineasRegistro - 3)) //Hago skip para saltarme las 3 que no dan datos
      {
        var header = regNumber.Matches(item)[0].Groups[1].Value;
        dt.Columns.Add(header); //Hago un split para separarlos y me quedo con el primero, que es el header
      }
      //Hago una iteracion por cada registro
      for (int i = 0; i < numeroRegistros; i++)
      {
        //Obtenemos el array de la linea 2, que es donde deduzco vienen los datos que quieres
        var datosRegistro = lineas[lineasRegistro * i + 1].Split(' '); //Utilizo la linea 2 de cada registro, por eso lineasRegistro*i + 1
        var id = datosRegistro[0];
        var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
        //Llenamos la tabla
        DataRow dr = dt.NewRow();
        dr[0] = id;
        dr[1] = fecha.ToString("dd/MM/yyyy");
        dr[2] = fecha.ToString("HH:mm:ss");
    
        int columna = 3;
    
        //Hago un skip de el registro anterior, selecciono tantas como lineas por registro hay, y me salto las 3 primeras que no aportan datos
        foreach (var item in lineas.Skip(lineasRegistro * i).Take(lineasRegistro).Skip(3))
        {
          var valor = regNumber.Matches(item)[1].Groups[1].Value; //Obtenemos el primer numero mediante regex
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
        }
        dt.Rows.Add(dr);
      }
      return dt;
    }

    Simplemente para usarla tendrías que hacer algo así:

    dataGridView1.DataSource = ParseData("tu ficehro");

    Para que eso funcione bien, he supuesto que el fichero de datos es 1 solo, donde vienen todos los datos sin lineas blancas entre medias, es decir, algo asi:

    996 20806 17710 21326 
    3197 18 11 30 08 04 2018 9.8 18.2 256 198 70 70 0 0 
    13381 114 
       73.67       28        7        0 
       75.65        2        0        0 
       77.63       -4       -5        0 
       79.61        5       -9        0 
       81.59       15       -1        0 
       83.57        0       11        0 
       85.55       -1       16        0 
       87.53       13        4        0 
       89.51        3       10        0 
       91.49        3       31        0 
       93.47       17       28        0 
       95.45       21        6        0 
       97.43       18        9        0 
       99.41        2        0       10 
      101.39       -5      -13       13 
      103.37        3      -20       10 
      105.35        6      -33        7 
      107.33        0      -25        0 
      109.31        0      -26        0 
      111.29       -4      -29       -6 
      113.27       -4      -18       -8 
      115.25       -6       -9       -5 
      117.23       -6       -8        0 
      119.21       -8       -5       -5 
      121.19        0      -15        0 
      123.17        6      -11        0 
      125.15      -19       -5        9 
      127.13      -33       11       12 
      129.11      -10       13        0 
      131.09       -9       32        0 
      133.07      -23       27       14 
      135.05        2       47        0 
      137.03       -5      -17        8 
      139.01       35        7       -7 
      140.99       11      -37        2 
      142.97       32      -53        4 
      144.95        0        0        0 
      146.93        0        0        0
    8996 20806 17710 21326 
    3198 18 21 30 08 04 2018 9.8 18.2 256 198 70 70 0 0 
    13381 117 
       73.67        0        9        5 
       75.65      -16        2        0 
       77.63       -1       -8        0 
       79.61       20       -9        0 
       81.59       25       12       -2 
       83.57        4       40        0 
       85.55      -22       42       -5 
       87.53      -29       32       -9 
       89.51      -17       16       -3 
       91.49      -18        9        0 
       93.47      -22       16       -7 
       95.45      -15       23      -10 
       97.43      -17       37       -8 
       99.41      -14       24       -7 
      101.39      -10        5       -5 
      103.37      -16        3       -4 
      105.35      -20        8       -8 
      107.33      -19       21       -7 
      109.31      -25       27        0 
      111.29      -14       32        0 
      113.27      -12       24        0 
      115.25      -20       13        0 
      117.23      -16        1        3 
      119.21      -11       22        5 
      121.19       -9       48        7 
      123.17      -22       46        0 
      125.15      -21       34        0 
      127.13        0       33        0 
      129.11        1       50        0 
      131.09       27       49        0 
      133.07       53       26        2 
      135.05       20       52        0 
      137.03       31       29      -11 
      139.01       33       -3      -18 
      140.99       17       -5       -8 
      142.97      -52       18       -7 
      144.95        0        0        0 
      146.93        0        0        0

    Me genera esta salida:

    El tema esta cogido con pinzas suponiendo varias cosas que no tienen porque ser así... Podrías confirmarme si el sensor genera solo 1 fichero o un fichero por registro? Podrías confirmarme el formato de el fichero para poder ajustar el código?

    Quedo a la espera de respuesta

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.


    lunes, 10 de septiembre de 2018 18:14
  • Todo ok pero se debe registrar las 4 columnas, la primera es el header la segunda columna  es el primer registro del, la tercera columna es el segundo registro y el cuarto columna es el tercer registro, algo asi Jorge 

    Registro        fecha           hora         70.63  70.63  70.63  71.25  71.25 71.25 

      31450    30/2/2018     18:00:32        23       4         0        0        -5      9

    esos registro es la profundidad, la velocidad de desenso, la recistencia velocidad vertical y la resistencia del agua,por ende aunque sea 0 el registro igual deberia ir 

    voy a tratar de arreglarlo  gracias

    despues pasarlo a excel 


    Una respuesta JP

    martes, 11 de septiembre de 2018 13:46
  • Comprendo...

    Dejame que haga unos cambios y en un rato te pongo algo.

    En principio entiendo que lo que he asumido del formato del txt es correcto y esa parte te funciona no? el unico problema que hay ahora es mostrar los 3 datos y no solo 1?

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    martes, 11 de septiembre de 2018 15:29
  • Bueno, el cambio ha sido facil:

    DataTable ParseData(string filePath)
    {
      DataTable dt = new DataTable();
      Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
      var lineas = File.ReadAllLines(filePath);
    
      int lineasRegistro = 0;
      //Obtengo el numero de lineas por registro
      for (int i = 3; i < lineas.Length; i++)
      {
        if (regNumber.Matches(lineas[i]).Count > 4) //Cuando la fila tienes mas de 4 numeros, es la lineade la fecha
        {
          lineasRegistro = i - 1; //Por lo tanto, es i - 1 suponiendo que no hay lineas en blanco 
          break;
        }
      }
    
      //Calculo el numero de registros en base al numero de lineas
      int numeroRegistros = lineas.Length / lineasRegistro;
    
      //generamos los headers de la tabla
      dt.Columns.Add("Registro");
      dt.Columns.Add("Dia");
      dt.Columns.Add("Hora");
      foreach (var item in lineas.Skip(3).Take(lineasRegistro - 3)) //Hago skip para saltarme las 3 que no dan datos
      {
        var header = regNumber.Matches(item)[0].Groups[1].Value;
        //Hago un split para separarlos y me quedo con el primero, que es el header, despues añado el (X)
        dt.Columns.Add(header + "(1)"); 
        dt.Columns.Add(header + "(2)"); 
        dt.Columns.Add(header + "(3)"); 
      }
      //Hago una iteracion por cada registro
      for (int i = 0; i < numeroRegistros; i++)
      {
        //Obtenemos el array de la linea 2, que es donde deduzco vienen los datos que quieres
        var datosRegistro = lineas[lineasRegistro * i + 1].Split(' '); //Utilizo la linea 2 de cada registro, por eso lineasRegistro*i + 1
        var id = datosRegistro[0];
        var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
        //Llenamos la tabla
        DataRow dr = dt.NewRow();
        dr[0] = id;
        dr[1] = fecha.ToString("dd/MM/yyyy");
        dr[2] = fecha.ToString("HH:mm:ss");
    
        int columna = 3;
    
        //Hago un skip de el registro anterior, selecciono tantas como lineas por registro hay, y me salto las 3 primeras que no aportan datos
        foreach (var item in lineas.Skip(lineasRegistro * i).Take(lineasRegistro).Skip(3))
        {
          var matches = regNumber.Matches(item); //Obtenemos los match del regex
          var valor = matches[1].Groups[1].Value; //Obtenemos el primer numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
          valor = matches[2].Groups[1].Value; //Obtenemos el segundo numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
          valor = matches[3].Groups[1].Value; //Obtenemos el tercer numero 
          dr[columna++] = valor; //Lo ponemos en la columna que le toca
        }
        dt.Rows.Add(dr);
      }
      return dt;
    }

    Si te fijas, he cambiado la parte de generación de los headers para añadir 3 veces cada dato con (1), (2), (3) y en la parte de rellenar, he cambiado un poco para hacer 1 regex, y utilizar cada match para rellenar la columna apropiada.

    Ya me comentaras si es lo que necesitabas

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    • Marcado como respuesta jpgrover viernes, 14 de septiembre de 2018 1:27
    martes, 11 de septiembre de 2018 15:42
  • Hola jorge te aviso que funciono y que hice o saque una idea de internet para exportarlo mañana te envio una copia del codigo gracias  mandame tu correo para estar en contacto nos vemos

    Una respuesta JP

    viernes, 14 de septiembre de 2018 1:29
  • Jorge encontre un error,

    te comento lo quen pasa que los datos pueden ser mas o menos en cada toma, uno puede ser 38 tomas en otra 40 o n, como te dije, el problema es que si colocamos el ultimo y ahi un ultimo +1 todo lo de abajo aumenta una fila al leerlo

    no se que si me entiendes espero que si te doy un ejemplo

    si ves en la toma 2 y 3 hay una toma mas a 146.93 que es 148.91, ese habria que leerlo y colocarlo y volver a contar los demas, no se que si e entiendes saludos

    8996 20806 17710 21326
    3197 18 11 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 114
       73.67       28        7        0
       75.65        2        0        0
       77.63       -4       -5        0
       79.61        5       -9        0
       81.59       15       -1        0
       83.57        0       11        0
       85.55       -1       16        0
       87.53       13        4        0
       89.51        3       10        0
       91.49        3       31        0
       93.47       17       28        0
       95.45       21        6        0
       97.43       18        9        0
       99.41        2        0       10
      101.39       -5      -13       13
      103.37        3      -20       10
      105.35        6      -33        7
      107.33        0      -25        0
      109.31        0      -26        0
      111.29       -4      -29       -6
      113.27       -4      -18       -8
      115.25       -6       -9       -5
      117.23       -6       -8        0
      119.21       -8       -5       -5
      121.19        0      -15        0
      123.17        6      -11        0
      125.15      -19       -5        9
      127.13      -33       11       12
      129.11      -10       13        0
      131.09       -9       32        0
      133.07      -23       27       14
      135.05        2       47        0
      137.03       -5      -17        8
      139.01       35        7       -7
      140.99       11      -37        2
      142.97       32      -53        4
      144.95        0        0        0
      146.93        0        0        0

    8996 20806 17710 21326
    3198 18 21 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 117
       73.67        0        9        5
       75.65      -16        2        0
       77.63       -1       -8        0
       79.61       20       -9        0
       81.59       25       12       -2
       83.57        4       40        0
       85.55      -22       42       -5
       87.53      -29       32       -9
       89.51      -17       16       -3
       91.49      -18        9        0
       93.47      -22       16       -7
       95.45      -15       23      -10
       97.43      -17       37       -8
       99.41      -14       24       -7
      101.39      -10        5       -5
      103.37      -16        3       -4
      105.35      -20        8       -8
      107.33      -19       21       -7
      109.31      -25       27        0
      111.29      -14       32        0
      113.27      -12       24        0
      115.25      -20       13        0
      117.23      -16        1        3
      119.21      -11       22        5
      121.19       -9       48        7
      123.17      -22       46        0
      125.15      -21       34        0
      127.13        0       33        0
      129.11        1       50        0
      131.09       27       49        0
      133.07       53       26        2
      135.05       20       52        0
      137.03       31       29      -11
      139.01       33       -3      -18
      140.99       17       -5       -8
      142.97      -52       18       -7
      144.95        0        0        0
      146.93        0        0        0
      148.91        0        0        0

    8996 20806 17710 21326
    3199 18 31 30 08 04 2018 9.8 18.2 256 198 70 70 0 0
    13381 117
       73.67       -7       16        5
       75.65       -6       21        8
       77.63        9       17        0
       79.61        5        7        0
       81.59        0        5        0
       83.57      -14       27       -5
       85.55      -31       38       -7
       87.53      -32       32       -6
       89.51       -7       20       -7
       91.49        0       19       -7
       93.47      -15       25        0
       95.45      -25       29        0
       97.43      -13       29        0
       99.41      -11       30        0
      101.39       -5       11        0
      103.37      -19        5        0
      105.35      -24       11        0
      107.33      -22       15        0
      109.31      -24        9        0
      111.29      -17        0        0
      113.27      -13        0        2
      115.25       -5        4        0
      117.23        0       16        0
      119.21       -7       22       -4
      121.19      -30       34        0
      123.17      -30       35        0
      125.15      -27       24        0
      127.13      -10      -10        0
      129.11        0      -21        0
      131.09       29      -22        0
      133.07       50      -31       -5
      135.05       54      -24      -14
      137.03       29      -28        0
      139.01       71       11      -23
      140.99        7      -17      -13
      142.97      -10      -19       -5
      144.95        0        0        0
      146.93        0        0        0
      148.91        0        0        0


    Una respuesta JP

    sábado, 15 de septiembre de 2018 0:06
  • Buenas,

    Sigo necesitando que me confirmes el formato del txt, voy a asumir que el texto que me pones es el formato, es decir, registro, linea en blanco, registro, linea en blanco, registro, etc, una vez asumiendo eso, prueba asi:

    DataTable ParseData(string filePath)
    {
        DataTable dt = new DataTable();
        Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
        var lineas = File.ReadAllLines(filePath);
    
        //Definimos una lista de listas de string, cada item sera un registro 
        //con una lista de strings que corresponden a sus datos
        List<string[]> registros = new List<string[]>();
        List<string> lineasregistro = new List<string>();
        foreach (var linea in lineas)
        {
            //Si no esta vacia, la añado a las lineas de registro
            if (!string.IsNullOrWhiteSpace(linea))
            {
                lineasregistro.Add(linea);
            }
            //Si esta vacia, cambia de registro, por lo tanto, añadimos las lineas al registro y volvemos a empezar
            else
            {
                registros.Add(lineasregistro.ToArray());
                lineasregistro = new List<string>();
            }
        }
        //Registramos el ultimo
        registros.Add(lineasregistro.ToArray());
    
        //Generamos los headers de la tabla comunes
        dt.Columns.Add("Registro");
        dt.Columns.Add("Dia");
        dt.Columns.Add("Hora");
    
        //Iteramos los registros
        foreach (var registro in registros)
        {
            var datosRegistro = registro[1].Split(' '); //Utilizo la linea 2 de cada registro
            var id = datosRegistro[0];
            var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
            //Llenamos la tabla
            DataRow dr = dt.NewRow();
            dr[0] = id;
            dr[1] = fecha.ToString("dd/MM/yyyy");
            dr[2] = fecha.ToString("HH:mm:ss");
    
            //Iteramos las filas de cada registro
            for (int i = 3; i < registro.Length; i++)
            {
                //Obtenemos los match del regex
                var matches = regNumber.Matches(registro[i]);
    
                //Comprobamos si existe la columna
                var header = regNumber.Matches(registro[i])[0].Groups[1].Value;
                var existeColumna = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName.Contains(header)).Count() > 0;
    
                //Si no existe la columna, añadimos
                if (!existeColumna)
                {
                    dt.Columns.Add(header + "(1)");
                    dt.Columns.Add(header + "(2)");
                    dt.Columns.Add(header + "(3)");
                }
    
                var valor = matches[1].Groups[1].Value; //Obtenemos el primer numero 
                dr[header + "(1)"] = valor; //Lo ponemos en la columna que le toca
                valor = matches[2].Groups[1].Value; //Obtenemos el segundo numero 
                dr[header + "(2)"] = valor; //Lo ponemos en la columna que le toca
                valor = matches[3].Groups[1].Value; //Obtenemos el tercer numero 
                dr[header + "(3)"] = valor; //Lo ponemos en la columna que le toca
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }

    Lo que he hecho es cambiar como se genera, tiene peor rendimiento porque en cada iteracion tiene que comprobar si la columna existe, pero creo que hace lo que tu quieres, suponiendo lo que te decía de lineas blancas intermedias. En caso de que los registros se separen de otra manera, tendrás que cambiar la primera parte donde se hace la lista de string[] por cada registro

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 16 de septiembre de 2018 18:36
  • Disculpa el atraso estamos en fiesta patria en Chile, asi que he estado medio desconectado te dejo mi wasap si quieres comunicarte via ese medio +56982657064

    el formato de TXT es el siguiente este es uno nuevo que me enviaron


    8996 20806 17710 21326
    1 12 37 18 07 11 2018 16.0 21.5 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    2 12 38 18 07 11 2018 16.0 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    3 12 39 18 07 11 2018 16.0 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    4 12 40 18 07 11 2018 16.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    5 12 41 18 07 11 2018 16.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    6 12 42 18 07 11 2018 16.0 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    7 12 43 18 07 11 2018 15.9 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    8 12 44 18 07 11 2018 15.7 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    9 12 45 18 07 11 2018 15.6 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    10 12 46 18 07 11 2018 15.5 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    11 12 47 18 07 11 2018 15.4 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    12 12 48 18 07 11 2018 15.4 21.6 256 198 15 70 0 255
    13381 24
       11.33     -133      170       53
        9.35       29      204     -102
        7.37        0        0        0
        5.39        0        0        0
        3.41        0        0        0
        1.43        0        0        0
       -0.55        0        0        0
       -2.53        0        0        0

    8996 20806 17710 21326
    13 12 49 18 07 11 2018 15.3 21.6 256 198 15 70 0 255
    13381 24
       11.33      -63       14       39
        9.35      115     -229     -186
        7.37        0        0        0
        5.39        0        0        0
        3.41        0        0        0
        1.43        0        0        0
       -0.55        0        0        0
       -2.53        0        0        0

    8996 20806 17710 21326
    14 12 50 18 07 11 2018 15.3 21.6 256 198 15 70 0 255
    13381 24
       11.33       39     -130       68
        9.35       10      356     -136
        7.37        0        0        0
        5.39        0        0        0
        3.41        0        0        0
        1.43        0        0        0
       -0.55        0        0        0
       -2.53        0        0        0

    8996 20806 17710 21326
    15 12 51 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    16 12 52 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    17 12 53 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    18 12 54 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    19 12 55 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    20 12 56 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    21 12 57 18 07 11 2018 15.1 21.6 256 198 15 70 0 255
    13381 24
       11.33      169     -210       16
        9.35      223     -171     -169
        7.37        0        0        0
        5.39        0        0        0
        3.41        0        0        0
        1.43        0        0        0
       -0.55        0        0        0
       -2.53        0        0        0

    8996 20806 17710 21326
    22 12 58 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    23 12 59 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    24 13 00 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    25 13 01 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    26 13 02 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    27 13 03 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    28 13 04 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    29 13 05 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    30 13 06 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    31 13 07 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    32 13 08 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    33 13 09 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    34 13 10 18 07 11 2018 15.1 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    35 13 11 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    36 13 12 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    37 13 13 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    38 13 14 18 07 11 2018 15.2 21.6 256 198 15 70 0 256
    13381 0

    8996 20806 17710 21326
    39 13 15 18 07 11 2018 15.2 21.6 256 198 15 70 0 255
    13381 24
       11.33     -200     -159       -2
        9.35       44     -721      -34
        7.37        0        0        0
        5.39        0        0        0
        3.41        0        0        0
        1.43        0        0        0
       -0.55        0        0        0
       -2.53        0        0        0

    si te das cuenta en un inicio no hay datos pero despues de varias nuestras hay datos  o sino esto



    8996 20806 17710 21326
    1 13 31 30 07 13 2018 14.3 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    2 13 41 30 07 13 2018 13.8 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    3 13 51 30 07 13 2018 12.9 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    4 14 01 30 07 13 2018 12.0 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    5 14 11 30 07 13 2018 11.5 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    6 14 21 30 07 13 2018 11.2 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    7 14 31 30 07 13 2018 11.0 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    8 14 41 30 07 13 2018 10.9 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    9 14 51 30 07 13 2018 10.9 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    10 15 01 30 07 13 2018 10.9 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    11 15 11 30 07 13 2018 10.9 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    12 15 21 30 07 13 2018 10.8 21.2 256 198 70 70 0 256
    13381 0

    8996 20806 17710 21326
    13 15 31 30 07 13 2018 10.0 21.2 256 198 70 70 0 0
    13381 111
       73.67       -7       34        0
       75.65       20       24        0
       77.63       28        3        0
       79.61       16        3        0
       81.59        0       18        0
       83.57      -20       10        0
       85.55      -26        9        0
       87.53      -19       20       -7
       89.51        0       23       -9
       91.49        0       26      -16
       93.47        3       36      -19
       95.45      -21       35      -14
       97.43      -58       50        0
       99.41      -70       53        0
      101.39      -52       49       -6
      103.37      -22       52       -9
      105.35       25       56      -19
      107.33       37       55      -24
      109.31       39       60      -22
      111.29       46       67      -20
      113.27       63       49      -16
      115.25       68       25      -10
      117.23       66       11       -8
      119.21       70       28      -11
      121.19       74       34      -11
      123.17       68       22        0
      125.15       57       15       -8
      127.13       75       17      -11
      129.11       88       30       -9
      131.09       83       52       -9
      133.07       71       53       -6
      135.05       61       48        0
      137.03       64       44        0
      139.01       50       58        0
      140.99       34      -14        8
      142.97       16       15       -1
      144.95       -5      -13        7

    8996 20806 17710 21326
    14 15 41 30 07 13 2018 9.9 21.2 256 198 70 70 0 0
    13381 111
       73.67        2       21        0
       75.65       23       48        0
       77.63       16       37        0
       79.61       12        2        0
       81.59        8        8        0
       83.57       -7       20        0
       85.55        0       15       -3
       87.53       10       29       -9
       89.51       -6       21       -7
       91.49      -16        0        0
       93.47      -12       11        0
       95.45      -11       19      -10
       97.43        7       22      -17
       99.41       -3       12      -23
      101.39      -27        3      -30
      103.37      -34       -3      -29
      105.35      -22      -15      -21
      107.33        0        0      -15
      109.31       21       22      -10
      111.29       22       29       -8
      113.27       25       35       -2
      115.25       32       19        0
      117.23       36       20        0
      119.21       31       41        0
      121.19       49       50        0
      123.17       58       49        8
      125.15       56       50        0
      127.13       50       42        0
      129.11       33       52        0
      131.09       38       62        5
      133.07       60       50        4
      135.05       29       45        0
      137.03        3       41        0
      139.01      -31       -9      -15
      140.99       -4       41        0
      142.97       11        2        3
      144.95       29       -9        0

    8996 20806 17710 21326
    15 15 51 30 07 13 2018 9.9 21.2 256 198 70 70 0 0
    13381 111
       73.67      -14        9       -3
       75.65       27       36       -9
       77.63       33       17       -5
       79.61       17       -2        0
       81.59        6        6        0
       83.57      -10        0       -3
       85.55      -10        2       -6
       87.53       -9       -3       -7
       89.51       -2       -6        0
       91.49       -3       -2        0
       93.47       -2       19       -4
       95.45       16       28       -4
       97.43        0       27       -6
       99.41      -30        0      -10
      101.39      -11       -6       -9
      103.37       14        2        0
      105.35       17        3        0
      107.33       25        8        0
      109.31       26       19        7
      111.29       25       19        6
      113.27       18       13        9
      115.25       25       12        8
      117.23       29       21        7
      119.21       34       15        4
      121.19       37       16        7
      123.17       41       11        0
      125.15       60       10        0
      127.13       57       17        3
      129.11       61       18        0
      131.09       68       26        0
      133.07       70       26        0
      135.05       35       22        0
      137.03       18       22        0
      139.01        3      -12        0
      140.99        5      -11       14
      142.97      -11        0        6
      144.95      -83      -50      -17

    8996 20806 17710 21326
    16 16 01 30 07 13 2018 9.9 21.2 256 198 70 70 0 0
    13381 111
       73.67        4      -19        0
       75.65       27      -16        0
       77.63       12      -13        0
       79.61       -6        0        3
       81.59       -5        7        0
       83.57       -9        8        0
       85.55      -16        1       -5
       87.53       -6       -1       -7
       89.51        0       -5        0
       91.49        8        3        0
       93.47        6        6        0
       95.45       11        0        0
       97.43       14      -12       -3
       99.41       29        0        0
      101.39       44        5        0
      103.37       48       23        0
      105.35       43       13        3
      107.33       49        0        6
      109.31       61       -7        9
      111.29       73        0        9
      113.27       81       -2       11
      115.25       73      -15        0
      117.23       63      -12        0
      119.21       63        0        5
      121.19       61       -2        5
      123.17       40       -9        8
      125.15       22        0       11
      127.13       22        0        7
      129.11       21        4        8
      131.09       20        1       12
      133.07       18        0       16
      135.05      -13       14        8
      137.03      -20        1        6
      139.01        5       12        9
      140.99       -4        7        2
      142.97       27       33       -1
      144.95      -18       25       -8

    8996 20806 17710 21326
    17 16 11 30 07 13 2018 10.0 21.2 256 198 70 70 0 0
    13381 111
       73.67       24      -20       -2
       75.65       36       -1        0
       77.63       32        3        0
       79.61       10       -3       -5
       81.59      -15      -14      -10
       83.57      -36      -32       -5
       85.55      -30      -23       -6
       87.53      -18        1      -10
       89.51      -17        4       -9
       91.49       -5        5        0
       93.47        1       11        0
       95.45        1       22        0
       97.43       -5       20        0
       99.41        7        9        5
      101.39       16        0       11
      103.37       27       10       12
      105.35       45       18       10
      107.33       42        8        8
      109.31       39        0        4
      111.29       29      -10        0
      113.27       11      -10        5
      115.25        9      -20        7
      117.23        8      -27        8
      119.21       18      -16        6
      121.19       13      -14       11
      123.17        1        0       16
      125.15        0       -8       20
      127.13        5      -19       19
      129.11      -10      -17       16
      131.09       -3       -2       11
      133.07       -8        0       13
      135.05      -10      -10       15
      137.03       22        6        0
      139.01       48       26        2
      140.99        0      -15       10
      142.97      -23       -2        3
      144.95       -9       33       -1

    8996 20806 17710 21326
    18 16 21 30 07 13 2018 10.0 21.2 256 198 70 70 0 0
    13381 111
       73.67        0       -2        0
       75.65        0      -10       -3
       77.63        5       -4        0
       79.61       -4       -7        0
       81.59      -19        6       -5
       83.57      -14        9        0
       85.55      -17        8        3
       87.53       -2        2        0
       89.51       -4        5        0
       91.49      -12        8        0
       93.47       -9       15        0
       95.45       -6        3        5
       97.43        7       -7        5
       99.41       19        1        4
      101.39       17       -8        5
      103.37       27        2        0
      105.35       35       -7        4
      107.33       38      -11        5
      109.31       32      -16        0
      111.29       26      -22        0
      113.27       28      -35        9
      115.25       24      -36       11
      117.23       32      -30        9
      119.21       35      -22        9
      121.19       32      -32        6
      123.17       17      -16        9
      125.15        7       -1       13
      127.13       15      -21       12
      129.11        4      -24       14
      131.09        8       -2       15
      133.07      -22       -5       18
      135.05      -27      -21       13
      137.03       30        0       -7
      139.01       12      -43        6
      140.99      -24      -11       -4
      142.97       -5       -8       -3
      144.95     -137      -22      -25

    te das cuenta que son variables puede tener 4 distintas altura o 41 o 3 o nadanos vemos y gracias


    Una respuesta JP

    jueves, 20 de septiembre de 2018 15:27
  • Okey,

    Ahora si! teniendo un fichero de ejemplo si se puede manejar bien!

    He hecho un ligero cambio, como los registros vacios siempre contienen 3 lineas, en el codigo he puesto que si el registro no tiene más de 3 lineas, se lo salte. Con eso, junto a la comprobacion de lineas en blanco para separar registros, he obtenido esto con tus datos de entrada:

    Te dejo el código:

    DataTable ParseData(string filePath)
    {
        DataTable dt = new DataTable();
        Regex regNumber = new Regex(@"(-?(\d*\.)?\d+)", RegexOptions.Compiled);
        var lineas = File.ReadAllLines(filePath);
    
        //Definimos una lista de listas de string, cada item sera un registro 
        //con una lista de strings que corresponden a sus datos
        List<string[]> registros = new List<string[]>();
        List<string> lineasregistro = new List<string>();
        foreach (var linea in lineas)
        {
            //Si no esta vacia, la añado a las lineas de registro
            if (!string.IsNullOrWhiteSpace(linea))
            {
                lineasregistro.Add(linea);
            }
            //Si esta vacia, cambia de registro, por lo tanto, añadimos las lineas al registro y volvemos a empezar
            else
            {
                //Al ser 3 lineas los datos del sensor, si SOLO hay 3 lineas, el reporte viene vacio o lo obviamos
                if (lineasregistro.Count > 3)
                    registros.Add(lineasregistro.ToArray());
                lineasregistro = new List<string>();
            }
        }
        //Registramos el ultimo
        registros.Add(lineasregistro.ToArray());
    
        //Generamos los headers de la tabla comunes
        dt.Columns.Add("Registro");
        dt.Columns.Add("Dia");
        dt.Columns.Add("Hora");
    
        //Iteramos los registros
        foreach (var registro in registros)
        {
            var datosRegistro = registro[1].Split(' '); //Utilizo la linea 2 de cada registro
            var id = datosRegistro[0];
            var fecha = Convert.ToDateTime(string.Format("{0}/{1}/{2} {3}:{4}:{5}", datosRegistro[4], datosRegistro[5], datosRegistro[6], datosRegistro[1], datosRegistro[2], datosRegistro[3]));
    
            //Llenamos la tabla
            DataRow dr = dt.NewRow();
            dr[0] = id;
            dr[1] = fecha.ToString("dd/MM/yyyy");
            dr[2] = fecha.ToString("HH:mm:ss");
    
            //Iteramos las filas de cada registro
            for (int i = 3; i < registro.Length; i++)
            {
                //Obtenemos los match del regex
                var matches = regNumber.Matches(registro[i]);
    
                //Comprobamos si existe la columna
                var header = regNumber.Matches(registro[i])[0].Groups[1].Value;
                var existeColumna = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName.Contains(header)).Count() > 0;
    
                //Si no existe la columna, añadimos
                if (!existeColumna)
                {
                    dt.Columns.Add(header + "(1)");
                    dt.Columns.Add(header + "(2)");
                    dt.Columns.Add(header + "(3)");
                }
    
                var valor = matches[1].Groups[1].Value; //Obtenemos el primer numero 
                dr[header + "(1)"] = valor; //Lo ponemos en la columna que le toca
                valor = matches[2].Groups[1].Value; //Obtenemos el segundo numero 
                dr[header + "(2)"] = valor; //Lo ponemos en la columna que le toca
                valor = matches[3].Groups[1].Value; //Obtenemos el tercer numero 
                dr[header + "(3)"] = valor; //Lo ponemos en la columna que le toca
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    jueves, 20 de septiembre de 2018 16:25