Skip to content
Snippets Groups Projects
csv2btl.m 9.2 KiB
Newer Older
% Programme de lecture des fichiers bouteilles au format CSV
% et conversion au format des fichiers BTL du programme TSG-QC
%
% ------------------------------------------------------------
clear
clc

% Repertoire en entree
% --------------------
% repIn  = 'D:\0-US191\UR-US Clientes\UR065 - LEGOS\UR065 - ORE SSS\Donnees\bouteilles\Fichiers CSV\2007';
% repOut = 'D:\0-US191\UR-US Clientes\UR065 - LEGOS\UR065 - ORE SSS\Donnees\bouteilles\fichier BTL_fmtTSG\2007\';
repIn  = 'F:\salinite\bouteilles\csv\2010\';
repOut = 'F:\salinite\bouteilles\btl\2010\';
% Constantes
% ----------
DELIMITER = ';';  % Chaque colonne du fichier est separee par DELIMITER
NBELEMENT = 6;    % Nombre d'élément de chaque ligne du fichier en entree

% Ouverture du fichier CSV
% ------------------------
eval( ['cd ''' repIn ' '' ']);
[file, pathname, filterIndex] = uigetfile( {'*.csv'}, 'Pick a file');

pathnameOut = repOut;

if ~isequal(file, 0)

  % Lecture des fichiers Labviews
  % -----------------------------
  fileIn  = [pathname file];
  file    = strrep(file, '.csv', '.btl');
  fileOut = [pathnameOut file];

  disp( file );
  disp( fileIn );
  disp( fileOut );


  % Parametres en sortie vides
  % --------------------------
  nblig = 0;
  DataIn = [];

  % Le nombre d'elements de l'entete determine le nombre de chaine a lire.
  % Je cree ici la chaine de caractere decrivant le format utilise par
  % textscan
  % ----------------------------------------------------------------------
  format = [];
  for i = 1:NBELEMENT
    format = [format ' %s'];
  end

  % Ouverture du fichier en lecture '.CSV'
  % --------------------------------------
  fid = fopen( fileIn, 'r');

  % Teste si le fichier existe
  % --------------------------
  if fid ~= -1

    % Read the first 8 (3) lines
    % ----------------------
    for i = 1:8
      line = fgetl( fid );
    end

    % Lecture de la date d'analyse des bouteilles
    % -------------------------------------------
    C = textscan(line, '%*s %s %*s %*s %d/%d/%d', 4,'delimiter', DELIMITER);
    cruiseID = char(C{1});
    year  = double( C{4} );
    day = double( C{3} );
    month   = double( C{2} );

    % conversion au format du logiciel TSGQC
    % -------------------------------------
    dateAnalysis = datestr( datenum(year,month,day,0,0,0), 'yyyymmddHHMMSS'  );

    % Lecture du type de bouteilles
    % -----------------------------
    line = fgetl( fid );
    C = textscan(line,'%*s%s', 1,'delimiter', DELIMITER)';
    bottleType = char(C{1});

    % Skip 4 lines
    % ------------
    for i = 1:4
      line = fgetl( fid );
    end

    % Lecture des données
    %
    % textscan permet de lire a peu pres tout, memes les lignes
    % incompletes, plus courtes.
    % Par contre les données lues sont enregistrees dans une
    % Cellule de cellule
    % ATTENTION :
    %   dans le cas de lignes incompletes textscan n'utilise pas
    %   enptyValue mais une chaine de caracteres vide
    % -----------------------------------------------------------
    data = textscan(fid, format, 'delimiter', DELIMITER,...
      'headerLines', 0 ,...
      'treatAsEmpty', ' ',...
      'emptyValue', NaN);

    % Allocation de mémoire
    % ---------------------
    [m,n]   = size(data{1});
    latitude  = NaN*ones(m,1);
    longitude = NaN*ones(m,1);
    year      = NaN*ones(m,1);
    month     = NaN*ones(m,1);
    day       = NaN*ones(m,1);
    hour      = NaN*ones(m,1);
    min       = NaN*ones(m,1);
    sss_buck  = NaN*ones(m,1);

    % Decode la date
    % Attention a la position des mois et du jour. Il y a inversion
    % dans les fichiers de Denis entre 2006 2007
    % --------------
    for i = 1 : m
      tab = sscanf( char( data{2}(i)), '%d/%d/%d' );
      if ~isempty( tab )
        year(i)  = tab(3);
        month(i) = tab(1);
        day(i)   = tab(2);
      end
    end

    % Decode l'heure
    % --------------
    for i = 1 : m
      tab = sscanf( char( data{3}(i)), '%d:%d' );
      if ~isempty( tab )
        hour(i) = tab(1);
        min(i)  = tab(2);
      end
    end

    % Decode les latitudes
    % --------------------
    for i = 1 : m
      [tab, count, errmsg, nextindex] = sscanf( char( data{4}(i)), '%d°%d''%s' ); % Avec minutes
      if ~isempty( errmsg )
        tab = sscanf( char( data{4}(i)), '%d°%d %s' ); % sans minutes
      end
      if ~isempty( tab )
        latitude(i) = tab(1) + tab(2)/60;
        if strcmp( char(tab(3)), 'S' )
          latitude(i) = -latitude(i);
        end
      else
        latitude(i) = NaN;
      end
    end

    % Decode les longitudes
    % --------------------
    for i = 1 : m
      [tab, count, errmsg, nextindex] = sscanf( char( data{5}(i)), '%d°%d''%s' ); % Avec minutes
      if ~isempty( errmsg )
        tab = sscanf( char( data{5}(i)), '%d°%d %s' ); % sans minutes
      end
      if ~isempty( tab )
        longitude(i) = tab(1) + tab(2)/60;
        if strcmp( char(tab(3)), 'W' )
          longitude(i) = -longitude(i);
        end
      else
        longitude(i) = NaN;
      end
    end

    % Decode la salinite
    % ------------------
    for i = 1 : m
      tab = sscanf( char( data{6}(i)), '%f' );
      if ~isempty( tab )
        sss_buck(i) = tab(1);
      end
    end

    % Fermeture du fichier en lecture
    % -------------------------------
    fclose( fid );

    % Ecriture resultat
    % ----------------

    % Test si l'un des éléments de la date est à NaN
    % ----------------------------------------------
    ind = find(isnan(year) | isnan(month) | isnan(day) | isnan(hour) | isnan(min) );
    if ~isempty( ind )

      hmb = msgbox( [{'Date incomplète pour certains enregistrements.'} {' '} ...
        {'Ces enregistrements sont éliminés.'} {' '} ...
        {'Liste des enregistrements dans le fenêtre Matlab.'}],...
        'Décodage Date', 'warn', 'modal');

      disp( 'Warning Date' );
      disp( 'Date incomplète pour les enregistrements suivants' );
      disp(ind);

      uiwait( hmb );
      
      year(ind)      = [];
      month(ind)     = [];
      day(ind)       = [];
      hour(ind)      = [];
      min(ind)       = [];
      latitude(ind)  = [];
      longitude(ind) = [];
      sss_buck(ind)  = [];
    end

    % Test si l'un des éléments de la position est à NaN
    % --------------------------------------------------
    ind = find( isnan(latitude) | isnan(longitude) );
    if ~isempty( ind )

      msgbox( [{'Position incomplète pour certains enregistrements.'} {' '} ...
        {'Liste des enregistrements dans le fenêtre Matlab.'}],...
        'Décodage Position', 'warn', 'modal');

      disp( 'Warning Position' );
      disp( 'Position incomplète pour les enregistrements suivants' );
      disp(ind);
    end

    % Classement par date croissante
    % ------------------------------
    date = datenum(year, month, day, hour, min, 0 );
    [date, iOrder] = sort(date);
    year      = year(iOrder);
    month     = month(iOrder);
    day       = day(iOrder);
    hour      = hour(iOrder);
    min       = min(iOrder);
    latitude  = latitude(iOrder);
    longitude = longitude(iOrder);
    sss_buck  = sss_buck(iOrder);

    % Nombre d'enregistrements
    % ------------------------
    [nbRecords, n] = size(sss_buck);

    % Type de donnees : format NetCdf de tsgqc
    % Blank before and after WS, more readable after concatenation
    % ------------------------------------------------------------
    label     = ' WS ';
    sss_type  = label( ones(nbRecords,1), :);

    % Cree le tableau donnant la date d'analyse.
    % il faut une date par echantillon
    % ------------------------------------------
    dateAnalysis  = dateAnalysis( ones(nbRecords,1), :);

    % tableau des secondes - N'existe pas pour l'instant dans les feuilles
    % Excel
    % --------------------------------------------------------------------
    sec       = zeros(nbRecords,1);

    % Code d equlaite des mesures - tout a 0
    % --------------------------------------
    code      = zeros(size(sss_buck));

    % Cree un tableau de caracteres avec toutes les informations
    % ----------------------------------------------------------
    bucket = [year month day hour min sec latitude longitude sss_buck code];
    format = '%04d %02d %02d %02d %02d %02d %12.7f %12.7f %6.3f %d';
    for i = 1:nbRecords
      bucketStr(i, :) = sprintf( format, bucket(i,:) );
    end

    % Concatene le type et la date d'analyse
    % --------------------------------------
    bucketStr = [ bucketStr sss_type ];
    bucketStr = [ bucketStr dateAnalysis ];

    % Ouverture du fichier en sortie
    % ------------------------------
    fid = fopen( fileOut, 'w');

    if fid ~= -1
      fprintf( fid, '%%CruiseID %s\r\n', cruiseID );
      fprintf( fid, '%%WS_TYPE %s\r\n', bottleType );
      fprintf( fid, '%%HEADER YEAR MNTH DAYX hh mi ss LATX_EXT LONX_EXT SSPS_EXT SSPS_EXT_QC SSPS_EXT_TYPE SSPS_EXT_ANALDATE \r\n');
      if ~isempty(bucketStr)
        for i = 1:nbRecords
          fprintf(fid, '%s\n', bucketStr(i,:)');
        end
      end
    end
    fclose( fid );

  end


  display( 'Fin du programme' );
end