Comando R data.table fread: ¿cómo leer archivos grandes con separadores irregulares?

Tengo que trabajar con una colección de 120 archivos de ~ 2 GB (525600 líneas x 302 columnas). El objetivo es hacer algunas estadísticas y poner los resultados en una base de datos SQLite limpia.

Todo funciona bien cuando mi script importa con read.table (), pero es lento. Así que lo intenté con fread, desde el paquete data.table (versión 1.9.2), pero me dio este error:

Error in fread(txt, header = T, select = c("YYY", "MM", "DD",  : 
Not positioned correctly after testing format of header row. ch=' '

Las primeras 2 líneas y 7 filas de mis datos se ven así:

 YYYY MM DD HH mm             19490             40790
 1991 10  1  1  0      1.046465E+00      1.568405E+00

Entonces, hay un primer espacio al principio, luego solo un espacio entre las columnas de fecha, luego un número arbitrario de espacios entre las otras columnas.

Intenté usar un comando como este para convertir espacios en coma:

DT <- fread(
            paste("sed 's/\\s\\+/,/g'", txt),
            header=T,
            select=c('HHHH','MM','DD','HH')
)

sin éxito: el problema persiste y parece ser lento con el comando sed.

A Fread no parece gustarle el "número arbitrario de espacio" como separador o columna vacía al principio. Alguna idea ?

Aquí hay un ejemplo reproducible (quizás) más pequeño (char de nueva línea después de 40790):

txt<-print(" YYYY MM DD HH mm             19490             40790
 1991 10  1  1  0      1.046465E+00      1.568405E+00")

testDT<-fread(txt,
              header=T,
              select=c("YYY","MM","DD","HH")
)

Gracias por tu ayuda !

ACTUALIZAR : - El error no ocurre con data.table 1.8. *. Con esta versión, la tabla se lee como una línea única, lo que no es mejor.

ACTUALIZACIÓN 2 - Como se mencionó en los comentarios, podría usar sed para formatear la tabla y luego leerla con fread. Puse un script en una respuesta anterior donde creo un conjunto de datos de muestra y luego, comparo algunos system.time ().

Respuestas a la pregunta(5)

Su respuesta a la pregunta