Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
TSG QC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
US191
TSG QC
Commits
816c6035
Commit
816c6035
authored
13 years ago
by
jacques.grelet_ird.fr
Browse files
Options
Downloads
Patches
Plain Diff
programme de conversionfichier bouteille csv en btl
parent
9cce352d
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tsg_tools/csv2btl.m
+301
-0
301 additions, 0 deletions
tsg_tools/csv2btl.m
with
301 additions
and
0 deletions
tsg_tools/csv2btl.m
0 → 100644
+
301
−
0
View file @
816c6035
% 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
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment