Matlab – Ayuda el uso de texto de análisis, ¿cómo ignorar los comentarios y el encabezado de las columnas?

Necesito ayuda para usar el texto escaneado. Estoy tratando de leer los datos que tiene el siguiente formato:

# ---------------------------------- WARNING ----------------------------------------
# The data you have obtained from this automated U.S. Geological Survey database
# have not received Director's approval and as such are provisional and subject to
# revision.  The data are released on the condition that neither the USGS nor the
# United States Government may be held liable for any damages resulting from its use.
# Additional info: http://nwis.waterdata.usgs.gov/nwis/help/?provisional
#
# File-format description:  http://nwis.waterdata.usgs.gov/nwis/?tab_delimited_format_info
# Automated-retrieval info: http://nwis.waterdata.usgs.gov/nwis/?automated_retrieval_info
#
# Contact:   gs-w_support_nwisweb@usgs.gov
# retrieved: 2013-09-13 13:10:29 EDT       (nadww01)
#
# Data for the following 1 site(s) are contained in this file
#    USGS 08067074 CWA Canal at Thompson Rd nr Baytown, TX
# -----------------------------------------------------------------------------------
#
# Data provided for site 08067074
#    DD parameter   Description
#    01   00010     Temperature, water, degrees Celsius
#    02   00095     Specific conductance, water, unfiltered, microsiemens per centimeter at 25 degrees Celsius
#
# Data-value qualification codes included in this output: 
#     A  Approved for publication -- Processing and review completed.  
#     P  Provisional data subject to revision.  
# 
agency_cd   site_no datetime    tz_cd   01_00010    01_00010_cd 02_00095    02_00095_cd
5s  15s 20d 6s  14n 10s 14n 10s
USGS    08067074    2013-01-05 00:00    CST 10.3    A   391 A
USGS    08067074    2013-01-05 00:15    CST 10.3    A   391 A
USGS    08067074    2013-01-05 00:30    CST 10.3    A   391 A
USGS    08067074    2013-01-05 00:45    CST 10.3    A   391 A
USGS    08067074    2013-01-05 01:00    CST 10.3    A   391 A
USGS    08067074    2013-01-05 01:15    CST 10.3    A   391 A
USGS    08067074    2013-01-05 01:30    CST 10.3    A   391 A
USGS    08067074    2013-01-05 01:45    CST 10.3    A   391 A
USGS    08067074    2013-01-05 02:00    CST 10.3    A   391 A
USGS    08067074    2013-01-05 02:15    CST 10.3    A   391 A
USGS    08067074    2013-01-05 02:30    CST 10.3    A   391 A
USGS    08067074    2013-01-05 02:45    CST 10.2    A   391 A
USGS    08067074    2013-01-05 03:00    CST 10.2    A   391 A
USGS    08067074    2013-01-05 03:15    CST 10.2    A   391 A
USGS    08067074    2013-01-05 03:30    CST 10.2    A   391 A
USGS    08067074    2013-01-05 03:45    CST 10.2    A   391 A
USGS    08067074    2013-01-05 04:00    CST 10.2    A   391 A
USGS    08067074    2013-01-05 04:15    CST 10.2    A   392 A
USGS    08067074    2013-01-05 04:30    CST 10.2    A   391 A
USGS    08067074    2013-01-05 04:45    CST 10.2    A   391 A
USGS    08067074    2013-01-05 05:00    CST 10.2    A   391 A
USGS    08067074    2013-01-05 05:15    CST 10.2    A   391 A
USGS    08067074    2013-01-05 05:30    CST 10.2    A   391 A
USGS    08067074    2013-01-05 05:45    CST 10.2    A   391 A
USGS    08067074    2013-01-05 06:00    CST 10.2    A   391 A
USGS    08067074    2013-01-05 06:15    CST 10.1    A   391 A
USGS    08067074    2013-01-05 06:30    CST 10.1    A   391 A
USGS    08067074    2013-01-05 06:45    CST 10.1    A   391 A
USGS    08067074    2013-01-05 07:00    CST 10.1    A   391 A
USGS    08067074    2013-01-05 07:15    CST 10.1    A   391 A
USGS    08067074    2013-01-05 07:30    CST 10.1    A   390 A
USGS    08067074    2013-01-05 07:45    CST 10.0    A   391 A
USGS    08067074    2013-01-05 08:00    CST 10.0    A   390 A
USGS    08067074    2013-01-05 08:15    CST 10.0    A   391 A
USGS    08067074    2013-01-05 08:30    CST 10.0    A   391 A
USGS    08067074    2013-01-05 08:45    CST 10.0    A   390 A
USGS    08067074    2013-01-05 09:00    CST 10.0    A   390 A
USGS    08067074    2013-01-05 09:15    CST 10  A   390 A
USGS    08067074    2013-01-05 09:30    CST 10  A   390 A
USGS    08067074    2013-01-05 09:45    CST 10  A   390 A
USGS    08067074    2013-01-05 10:00    CST 10  A   390 A
USGS    08067074    2013-01-05 10:15    CST 10  A   390 A
USGS    08067074    2013-01-05 10:30    CST 10  A   390 A
USGS    08067074    2013-01-05 10:45    CST 10  A   390 A
USGS    08067074    2013-01-05 11:00    CST 10  A   390 A
USGS    08067074    2013-01-05 11:15    CST 10  A   390 A
USGS    08067074    2013-01-05 11:30    CST 10  A   390 A
USGS    08067074    2013-01-05 11:45    CST 10  A   389 A
USGS    08067074    2013-01-05 12:00    CST 10  A   389 A
USGS    08067074    2013-01-05 12:15    CST 10  A   389 A
USGS    08067074    2013-01-05 12:30    CST 10  A   389 A
USGS    08067074    2013-01-05 12:45    CST 10  A   389 A
USGS    08067074    2013-01-05 13:00    CST 10  A   389 A
USGS    08067074    2013-01-05 13:15    CST 10  A   389 A
USGS    08067074    2013-01-05 13:30    CST 10  A   389 A

Las dos únicas entradas de datos, estoy preocupado con el son de «la conductancia Específica», y «fecha». (columnas 3 y 7, respectivamente)

Yo era capaz de hacer esto de manera consistente con el siguiente código:

%% 
% Collect conductance data
filename = 'conductivityData_Temp_File';


%%
% Determine length of data file 
fid = fopen('conductivityData_Temp_File','r');
fseek(fid, 0, 'eof');
chunksize = ftell(fid);
fseek(fid, 0, 'bof');
ch = fread(fid, chunksize, '*uchar');
N = sum(ch == sprintf('\n')); % number of lines
fclose(fid)

%% 
% Read conductivity data
fileconductID = fopen(filename);
waterConductivityData = textscan(fileconductID, '%s %d %s %s %f %s %f %s', N, 'delimiter', '\t', 'EmptyValue', 0, 'headerlines', 27);
fclose(fileconductID);

Sin embargo, me enteré de que usted puede simplemente utilizar ‘commentstyle a ignorar los comentarios. Esto es importante porque lo estoy leyendo en varios archivos y de vez en cuando yo le encuentro un archivo que no tiene exactamente el 27 de comentario filas. Que va a hacer mi programa de tirar un error.

Alguien puede decirme cómo puedo ajustar mi textscan código de ignorar el comentario filas y omitir las dos filas de encabezado?

Me disculpo si el código de ejemplo que suministra es complicado, pero básicamente mi error reside en esta línea de código:

waterConductivityData = textscan(fileconductID, '%s %d %s %s %f %s %f %s', N, 'delimiter', '\t', 'EmptyValue', 0, 'headerlines', 27);

(si desea descargar un ejemplo de ficha deliminated archivo para trabajar con el uso de este enlace: aquí

Gracias!

RESPUESTA:


Gracias TryHard, que era un buen método, pero yo quería estar más cerca de lo que estaba haciendo anteriormente. Al parecer, mi Delimitadores estaban fuera.

waterConductivityData = textscan(fileconductID,'%s %s %s %s %s %s %s %s %s ' , 'Delimiter', '\t', 'CommentStyle', '#');

dates = waterConductivityData{3}(3:end);
conductancesStr = waterConductivityData{7}(3:end);
temperaturesStr = waterConductivityData{5}(3:end);

conductances = str2double(conductancesStr);
temperatures = str2double(temperaturesStr);
InformationsquelleAutor John August | 2013-09-13

2 Kommentare

  1. 1

    Cambiar su textscan línea a este:

    waterConductivityData = textscan(fileconductID, '%s %d %s %s %f %s %f %s', N, 'Delimiter', '\t', 'EmptyValue', 0, 'CommentStyle', '#');

    Y, a continuación, obtener las columnas que quería como este:

    dates = waterConductivityData{3}(3:end)
    conductances = waterConductivityData{7}(3:end)
    • Sí, esto es lo que estoy preguntando, pero su respuesta no funciona de la manera que yo esperaba. Sólo devuelve: ‘agency_cd’ [] [] [] [] [] [] []
    • Ah, se me acaba de asumir la formatSpec estaba trabajando. Agarra y te vamos a tirar en Matlab.
    • He editado mi respuesta inicial. Déjeme saber si eso aún no es el resultado que esperaba.
    • Esto funcionó después de cambiar los delimitadores. Yo también acabó con ‘N’
  2. 0

    Una forma de eludir la variable longitud de encabezado es analizar el archivo de la siguiente manera:

    fid=fopen(file);
    str=textscan(fid,'%s')
    fclose(fid)
    
    str2=strvcat(str{1});
    fst=strmatch('CST',str2);
    
    dtstr = str2(fst(1)-2:9:end,:);   % date strings
    timstr = str2(fst(1)-1:9:end,:);  % time strings
    condctv = str2(fst(1)+3:9:end,:); % conductivity string

    Este se encuentra la primera ocurrencia de la cadena «CST» y analiza suponiendo que las líneas de datos a ser organizado de manera similar en todos los archivos, y se requiere «CST» que se produzca en la primera fila de datos de la tabla. Si eso no es una constante en sus archivos de datos, a continuación, la idea es la de un busto. Sin embargo, usted podría ser capaz de utilizar otras cadenas para trazar su camino a través de la tabla de datos, asumiendo que son únicas y siempre aparecen en el mismo lugar. El siguiente hace uso de la última especificador de formato en la cadena de formato:

    str2=strvcat(str{1});
    fst=strmatch('10s',str2);
    fst=fst(end);
    
    dtstr = str2(fst+3:9:end,:);
    timstr = str2(fst+4:9:end,:);
    condctv = str2(fst+8:9:end,:);

    Usted puede convertir las cadenas en condctv en datos numéricos con str2num, de la siguiente manera:

    condctv = str2num(conductv);
    • Esto parece sólo obra es «cst» en el archivo. He estado tratando de conseguir que el trabajo por la búsqueda de ‘USGS’ en lugar de ello, ya que esto ocurre en cada archivo. El otro tema es que necesito tener los datos en las matrices no como verticalmente cadenas concatenadas.
    • El uso de USGS es un poco más arriesgado, ya que muestra en los comentarios. Por otra parte se puede buscar la última aparición de un marcador de comentario #, pero esto es casi el mismo como la alternativa de respuesta que puedo modificar la respuesta a usar # si usted prefiere(o se puede averiguar :). Los datos se pueden convertir fácilmente y se colocan en una matriz. Por ejemplo str2num(condctv) devuelve un vector columna con las conductividades.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea