Comparar datos de un txt guardados en SD

Que tal chicos!

Nuevamente me dirijo a los mejores para pedir un aventón !

He realizado un programa capaz de almacenar en una tarjeta SD 8 temperaturas diferentes, seguido de la fecha y hora gracias a un RTC.
Toda esta información se almacena en un .txt de forma ordenada, y de la siguiente manera:

29.5		 25.5		 28.0		 23.5		 nan		 nan		 18.2		 19.2		24/10/16	21:20:47
29.0		 25.5		 29.5		 23.0		 nan		 nan		 17.7		 19.0		24/10/16	21:25:47
29.2		 26.0		 29.0		 21.2		 nan		 nan		 18.2		 18.7		24/10/16	21:30:47
30.5		 26.0		 29.2		 21.5		 nan		 nan		 18.0		 19.0		24/10/16	21:35:47
30.0		 27.0		 29.0		 23.2		 nan		 nan		 18.0		 18.7		24/10/16	21:40:47
31.7		 26.2		 30.0		 22.5		 nan		 nan		 18.0		 18.5		24/10/16	21:45:48
32.2		 27.2		 31.0		 21.7		 nan		 nan		 17.7		 19.0		24/10/16	21:50:48
31.7		 27.7		 30.2		 20.5		 nan		 nan		 17.7		 19.0		24/10/16	21:55:48
32.0		 28.2		 31.5		 22.0		 nan		 nan		 17.7		 18.7		24/10/16	22:0:48
31.7		 27.2		 31.0		 20.2		 nan		 nan		 17.7		 18.7		24/10/16	22:5:48
33.0		 29.0		 30.2		 21.5		 nan		 nan		 17.2		 18.7		24/10/16	22:10:48
33.2		 28.5		 31.5		 21.2		 nan		 nan		 17.7		 18.2		24/10/16	22:15:48
34.0		 29.5		 32.7		 19.5		 nan		 nan		 17.5		 18.5		24/10/16	22:20:48
34.2		 29.5		 32.0		 21.2		 nan		 nan		 17.5		 18.5		24/10/16	22:25:48
35.2		 30.2		 33.7		 21.7		 nan		 nan		 17.2		 18.0		24/10/16	22:30:48
36.5		 30.2		 33.2		 22.0		 nan		 nan		 17.5		 18.0		24/10/16	22:35:48
36.5		 30.5		 34.2		 19.7		 nan		 nan		 16.5		 18.0		24/10/16	22:40:48
36.7		 31.5		 33.5		 21.5		 nan		 nan		 17.0		 18.2		24/10/16	22:45:48
38.0		 31.7		 33.5		 21.5		 nan		 nan		 17.2		 17.7		24/10/16	22:50:48
38.2		 32.5		 35.2		 20.0		 nan		 nan		 17.0		 18.0		24/10/16	22:55:48
39.0		 33.0		 35.0		 20.0		 nan		 nan		 17.0		 17.7		24/10/16	23:0:48
39.7		 33.5		 35.5		 21.5		 nan		 nan		 16.5		 17.5		24/10/16	23:5:49
40.2		 33.5		 36.0		 21.7		 nan		 nan		 17.0		 18.0		24/10/16	23:10:49
40.5		 34.2		 35.7		 21.7		 nan		 nan		 17.2		 18.0		24/10/16	23:15:49
41.0		 35.0		 36.5		 21.5		 nan		 nan		 17.0		 17.7		24/10/16	23:20:49
42.0		 35.2		 37.7		 21.5		 nan		 nan		 17.2		 18.2		24/10/16	23:25:49
43.5		 35.7		 38.2		 21.2		 nan		 nan		 16.7		 17.7		24/10/16	23:30:49
43.5		 36.7		 38.5		 22.2		 nan		 nan		 17.0		 17.5		24/10/16	23:35:49
45.0		 36.5		 37.7		 21.5		 nan		 nan		 16.2		 17.7		24/10/16	23:40:49
45.2		 38.2		 38.2		 21.7		 nan		 nan		 17.0		 17.7		24/10/16	23:45:49
47.5		 38.2		 39.0		 22.0		 nan		 nan		 16.5		 17.5		24/10/16	23:50:49
47.7		 38.5		 41.2		 21.7		 nan		 nan		 16.7		 17.7		24/10/16	23:55:49
49.0		 39.7		 39.2		 20.5		 nan		 nan		 17.0		 17.7		25/10/16	0:0:49
49.2		 40.0		 40.0		 20.0		 nan		 nan		 16.5		 18.2		25/10/16	0:5:49
50.0		 40.7		 42.0		 22.0		 nan		 nan		 16.7		 18.0		25/10/16	0:10:49
50.7		 40.7		 42.2		 20.2		 nan		 nan		 16.2		 18.0		25/10/16	0:15:49
50.2		 42.5		 43.7		 21.5		 nan		 nan		 16.5		 17.5		25/10/16	0:20:49
51.2		 44.2		 44.2		 21.7		 nan		 nan		 16.5		 17.7		25/10/16	0:25:50
50.2		 43.5		 45.0		 20.0		 nan		 nan		 16.7		 17.2		25/10/16	0:30:50
50.0		 44.7		 45.2		 20.5		 nan		 nan		 16.5		 18.0		25/10/16	0:35:50
50.5		 45.7		 45.5		 21.7		 nan		 nan		 16.2		 17.2		25/10/16	0:40:50
50.5		 46.2		 45.7		 20.7		 nan		 nan		 16.7		 17.5		25/10/16	0:45:50
49.7		 47.0		 47.7		 22.5		 nan		 nan		 16.2		 17.5		25/10/16	0:50:50
49.2		 47.2		 47.0		 20.7		 nan		 nan		 16.2		 17.2		25/10/16	0:55:50
49.0		 47.2		 49.0		 20.5		 nan		 nan		 16.0		 17.7		25/10/16	1:0:50
49.0		 47.5		 47.7		 20.7		 nan		 nan		 16.5		 17.2		25/10/16	1:5:50
48.2		 47.7		 49.2		 22.7		 nan		 nan		 16.0		 17.5		25/10/16	1:10:50
49.7		 47.2		 49.5		 20.2		 nan		 nan		 16.7		 17.2		25/10/16	1:15:50
49.0		 46.7		 49.7		 23.0		 nan		 nan		 16.5		 17.2		25/10/16	1:20:50
48.7		 47.0		 49.7		 23.0		 nan		 nan		 16.7		 17.5		25/10/16	1:25:50
48.0		 46.7		 49.0		 22.7		 nan		 nan		 16.7		 18.0		25/10/16	1:30:50
48.7		 47.2		 49.5		 22.5		 nan		 nan		 16.2		 16.7		25/10/16	1:35:50
48.2		 46.7		 47.5		 22.7		 nan		 nan		 16.5		 17.2		25/10/16	1:40:50
47.0		 46.7		 48.5		 23.2		 nan		 nan		 16.2		 17.5		25/10/16	1:45:51
47.2		 46.2		 47.7		 22.5		 nan		 nan		 16.0		 17.2		25/10/16	1:50:51
48.2		 46.0		 48.0		 22.5		 nan		 nan		 16.2		 16.7		25/10/16	1:55:51
47.0		 45.7		 49.2		 23.2		 nan		 nan		 16.0		 16.7		25/10/16	2:0:51
47.5		 46.7		 49.0		 22.5		 nan		 nan		 16.2		 17.0		25/10/16	2:5:51
47.0		 45.7		 46.5		 22.7		 nan		 nan		 16.2		 16.2		25/10/16	2:10:51
47.0		 45.2		 47.0		 21.2		 nan		 nan		 16.0		 17.2		25/10/16	2:15:51
46.2		 45.7		 48.2		 23.0		 nan		 nan		 16.0		 17.2		25/10/16	2:20:51
47.2		 45.0		 46.7		 21.7		 nan		 nan		 15.8		 17.0		25/10/16	2:25:51
46.5		 45.2		 47.5		 22.7		 nan		 nan		 15.8		 16.5		25/10/16	2:30:51
45.7		 45.5		 45.7		 21.2		 nan		 nan		 15.8		 16.7		25/10/16	2:35:51
46.5		 45.2		 46.2		 22.7		 nan		 nan		 15.8		 16.7		25/10/16	2:40:51
46.0		 44.0		 45.7		 23.0		 nan		 nan		 15.3		 16.7		25/10/16	2:45:51
45.5		 45.2		 46.0		 23.0		 nan		 nan		 15.8		 16.2		25/10/16	2:50:51
46.2		 44.7		 45.5		 23.0		 nan		 nan		 15.8		 16.0		25/10/16	2:55:51
45.7		 44.5		 45.2		 23.5		 nan		 nan		 15.5		 16.5		25/10/16	3:0:51

En donde cada columna corresponde a las temperaturas T1, T2, ... T8.
("nan" son las termocuplas no conectadas, ya que no siempre necesito de 8 temperaturas).

En concreto, lo que busco es poder unificar cuál y a que hora se produjo el peak y que se almacene en variable,
que para este ejemplo fue de 51.2 ºC a las 0:25:50

51.2		 44.2		 44.2		 21.7		 nan		 nan		 16.5		 17.7		25/10/16	0:25:50

Teóricamente no se lee tan difícil, pero sabemos que de la teoría a la práctica pueden haber muchas complicaciones.

Desde ya agradezco sus positivas respuestas !!

A ver si entendí:

Lo que quieres es saber en qué línea está la temperatura más alta?
Lo que necesitas es la línea completa, o sólo la medición con la hora en que se registró?

exacto, es lo que quiero estimado.

y no es necesaria la linea completa, en un principio necesito la temperatura mas alta, y la hora a la que sensó dicha temperatura.

Solo debes leer todo el archivo, e ir comparando las temperaturas y extraer los datos que quieras presentar.
Si pudiste guardarlos, podrás leerlos.
Los datos estan separados por tab o por espacios?
Usa el mismo criterio usado para guardarlos, para recupearlos.
Debes separarlos e ir comparando cada temperatua leída con a anterior y dejar la máxima. Al final del ciclo, tendrás tu valor máximo

Se ve grande porque así de compleja (mas no difícil de entender si se leen los comentarios) es la solución que he propuesto para tu planteamiento.

// IMPORTANTE: EL ARCHIVO DEBE TERMINAR CON UNA LÍNEA EN BLANCO
// Suponiendo que el archivo ya está abierto para lectura

String mayorRegistro() {
  archivo.seek(buscarLineaMayor()); // Ir a donde está el mayor de los registros
  char linea[150]; // Reservar espacio en memoria, para leer una sola línea
  linea[archivo.readBytesUntil('\r', linea, 149)] = 0; // Leer la línea
  char* p = strtok(linea, "\t"); // Fragmentarla para la función hallarMayor (temperatura registrada)

  float mayor = hallarMayor(p);
  p = strtok(NULL, "\t"); // Descartar la fecha

  char s[20];
  sprintf(s, "%.1f ºC\t\t%s", mayor, p); // Temperatura dada con un decimal + dos tabuladores horizontales + la hora
  return String(s);
  // Debe retornar un String cuyo contenido es; por ejemplo: "51.2 ºC   0:25:50"
}

unsigned long buscarLineaMayor() { 
  unsigned long rIdx = 0; // Posición del primer caracter donde se encuentra la línea con el valor más alto.
  float mayor = 0.0; // Punto de referencia para comparar si hay un valor todavía más grande que el anterior.
  char linea[150]; // Reservar espacio en memoria, para leer una línea a la vez.
  archivo.seek(0); // Leer desde el principio.
  while (archivo.available()) {
    unsigned long cIdx = archivo.position(); // Posición (en el archivo) del primer caracter de la línea a procesar
    linea[archivo.readBytesUntil('\r', linea, 149)] = 0; // Leer la línea
    archivo.read(); // Descarta '\n'
    char* p = strtok(linea, "\t");
    float actual = hallarMayor(p); // Fragmentarla para la función hallarMayor (temperatura registrada)
    if (actual > mayor) { // Si el mayor de esta línea lo es para el de alguna anterior
      mayor = actual; // Actualizar el punto de referencia
      rIdx = cIdx // Y la posición en el archivo
    }
  }
  return rIdx; // Creo que ya lo había explicado al principio de esta función
}

float hallarMayor(char* parte) {
  float mayor = 0.0;
  for (byte i = 0; i < 8; i++) {
    float f = atof(parte);
    if (f > mayor)
      mayor = f;

    parte = strtok(NULL, "\t");
  }
  return mayor;
}

Para probarlo:

Crea la variable global:

File archivo;

Abre el archivo que necesitas procesar:

archivo = SD.open("Archivo.txt");

Imprime el resultado de mi código propuesto:

Serial.println(mayorRegistro());

Chicos , debido a la complejidad innecesaria de ir comparando todo el documento una y otra vez he procedido a crear una variable anterior para compararla con la actual. Con el propósito de saber al instante si la temperatura sensada es mayor al peak anterior. Si lo esto es verdadero, pues ese será mi nuevo peak.

  if (T1 > T1ant) {                                         // pregunto si la temperatura actual es mayor a la anterior
    peakT1 = T1;                                            // mi nuevo peak es igual a la temperatura actual
    T1ant = T1;                                             // mi temperatura anterior será igual a mi temperatura actual
    sprintf(horaPeak1, "%d:%d:%d", t.hour, t.min, t.sec);   // guarda la hora actual en una variable, así sabré a que hora fue el peak
  }

Les comento esto para no dejar el tema inconcluso y obviamente para agradecer sus respuestas, ya que gracias a éstas, pude generar una solución que se adapta a mis básicas necesidades.

De antemano, muchas gracias.

Francuqo:

sprintf(horaPeak1, "%d:%d:%d", t.hour, t.min, t.sec);   // guarda la hora actual en una variable, así sabré a que hora fue el peak

Era la hora actual y no la registrada?

De ser así entonces ya viste lo fácil que era implementarlo.

Mi propuesta... es cierto que involucra el archivo entero, pero busca el valor más alto de todos, y la hora registrada, no la actual; esa es la diferencia.

PD: se supone que la hora debería formatearse así:

sprintf(horaPeak1, "%02d:%02d:%02d", t.hour, t.min, t.sec);

Por ejemplo: la una de la mañana, cinco minutos y ocho segundos, se vería así:

// Tu formato: 1:5:8
// Mi formato: 01:05:08

Ves que diferente?

Exactamente mi estimado amigo ! ... cuando lo probé me di cuenta del fastidioso detalle!

Agradecido de sus comentarios ! y no crea que no le echaré mano a su código, pues más adelanté necesitaré revisar el documento completo !

Atte

Francuqo

Francuqo:
y no crea que no le echaré mano a su código, pues más adelanté necesitaré revisar el documento completo !

Que por cierto había olvidado explicar unas cosas.

El siguiente fragmento no cambia nada en el código, solo le agrega comentarios:

float hallarMayor(char* parte) { // El parámetro se supone que debe ser el primer fragmento de la respectiva línea
  float mayor = 0.0; // Punto de referencia para comparar si hay un valor todavía más grande que el anterior.
  for (byte i = 0; i < 8; i++) { // Recorre las ocho lecturas que tiene una línea de texto
    float f = atof(parte); // Aquí es donde convertimos texto a float. Aquí "nan" equivale a 0.0
    if (f > mayor) // Si el mayor de esta línea lo es para el de alguna anterior
      mayor = f;  // Actualizar el punto de referencia

    parte = strtok(NULL, "\t"); // Pasar el siguiente fragmento (lectura).
  }
  return mayor; // Quien haya resultado ser el valor más alto
}