Commit d1f9fd33 authored by LIBES Maurice's avatar LIBES Maurice 🏋🏾
Browse files

prise en compte des valeurs chaines de caracteres dans le fichier CSV

parent c004ae21
This diff is collapsed.
File added
File added
......@@ -3,11 +3,12 @@
import netCDF4 as nc
import pandas as pd
import datetime
from datetime import date, time, datetime, timedelta
from datetime import datetime
import numpy as np
import argparse
import os
import sys
from termcolor import cprint
def Convert_Datenum():
dateHeure = []
......@@ -22,7 +23,7 @@ def Convert_Datenum():
datenum = nc.date2num(dateobs, units=NC_TIME_FMT)
dateHeure.append(datenum)
except:
print("La date attendue n'est pas au format ISO yyymmddThh:mm:ss ")
print("La date attendue n'est pas au format ISO yyymmddThh:mm:ss ",dateiso)
sys.exit(0)
#print("tableau dateHeure ",dateHeure)
......@@ -36,7 +37,7 @@ def Generate_NetCDF(csvfile):
netCDFFileName = csvfile.replace('.csv', '.nc')
print("Generating NetCDF File : ", netCDFFileName)
cprint("Generating NetCDF File : " +netCDFFileName, color='blue', attrs=['bold'])
ncFile = nc.Dataset(netCDFFileName, 'w', format='NETCDF4')
return ncFile
......@@ -53,6 +54,7 @@ def Get_dimension():
##
def Index_selector(index):
#Selectionne une ligne du fichier csv par son nom d'index
if(index == 'unites'):
final = csvheader.loc[index]
elif(index == 'standard_name'):
......@@ -61,8 +63,48 @@ def Index_selector(index):
final = csvheader.loc[index]
elif(index == 'dimension'):
final = csvheader.loc[index]
elif(index == 'Station'):
final = csvheader.loc[index,'Station_name']
print("final ",final)
return final
##
def Index_Selector_Metadata(index):
# Selectionne une ligne du fichier csv metadata par son nom d'index et on prend la valeur en premiere position 0
if (index == 'rfa'):
val_att = glob_att.loc[index].values[0]
elif (index == 'license'):
val_att = glob_att.loc[index].values[0]
elif (index == 'summary'):
val_att = glob_att.loc[index].values[0]
elif (index == 'lineage'):
val_att = glob_att.loc[index].values[0]
elif (index == 'project'):
val_att = glob_att.loc[index].values[0]
elif (index == 'description'):
val_att = glob_att.loc[index].values[0]
elif (index == 'title'):
val_att = glob_att.loc[index].values[0]
elif (index == 'keywords'):
val_att = glob_att.loc[index].values[0]
elif (index == 'comment'):
val_att = glob_att.loc[index].values[0]
elif (index == 'history'):
val_att = glob_att.loc[index].values[0]
elif (index == 'featuretype'):
val_att = glob_att.loc[index].values[0]
elif (index == 'cdm_data_type'):
val_att = glob_att.loc[index].values[0]
elif (index == 'cdm_timeserie_variables' or index =='cdm_profile_variables' or 'cdm_trajectory_variables'):
val_att = glob_att.loc[index].values[0]
elif (index == 'keywords'):
val_att = glob_att.loc[index].values[0]
else:
cprint("l'index que vous avez mis n'existe pas dans le fichier csv metadata", color=['red'], attrs=['bold'])
return val_att
##
def Get_Formats():
......@@ -71,7 +113,7 @@ def Get_Formats():
liste_formats = [] #on recoit un tableau numpy a ce niveau, les types numpy sont np.float, np.int
ligne=csvdata.iloc[0] # on prend une ligne de données sous forme de série pandas
ligne=csvdata.iloc[0]# on prend une ligne de données sous forme de série pandas
l=ligne.tolist() # on la converti en tableau numpy avec la fonction tolist()
for value in ligne:
......@@ -95,123 +137,172 @@ def Get_Formats():
##
def Create_dimensions(dimension):
# defining the dimensions :
# Creation des dimensions du ficher NetCDF :
ncFile.createDimension(dimension, None)
ncFile.createDimension('lenstation', len(stationname))
print("nom station create dim ", stationname)
print('Dimension OK')
cprint('Dimension OK', color='green', attrs=['bold'])
return 0
##
def Create_Write_Variables(dim, csvfile):
global csvdata
# recuperation du nom des colonnes
#Creation des variables NetCDF et remplissage de leurs tableaux automatiquement sauf pour le cas particulier 'Date'
units = Index_selector('unites')
standard_name = Index_selector('standard_name')
long_name = Index_selector('long_name')
frmt=Get_Formats() # déterminer le type des variables (int, float, str...)
#print("sortie frmt ", frmt)
cols = csvdata.columns.values #recupere le nom des colonnes
dateHeure=Convert_Datenum() # convertit les dates ISO 2011-01-16T09:38:00 en format numérique pour NetCDF
# déterminer le type des variables (int, float, str...)
frmt=Get_Formats()
print("sortie frmt ", frmt)
# recupere le nom des colonnes
# convertit les dates ISO 2011-01-16T09:38:00 en format numérique pour NetCDF
dateHeure=Convert_Datenum()
#print(dateHeure)
i = 0
i = 0 # index de colonnes
for col in cols:
print("format ",frmt[i] )
print("col ",col)
if (col == "Date"):
frmt[i]='i4' #on force la date en Int car on l'a convertie en Int avec la fonction Convert_Datenum()
units[i] = NC_TIME_FMT
## creation des variables NetCDf avec le nom des colonnes du fichier CSV
## creation des variables NetCDf avec le nom des colonnes du fichier CSV
tabcol = ncFile.createVariable(col, frmt[i], dim) #on cree la variable NetCDF et on l'associe a un tableau tabcol
## rajout de certains attributs en fonction des variables
## rajout de certains attributs Netcdf en fonction des variables
## Attention : si on rajoute des atributs "toto" dans le header du fichier CSV, il FAUDRA modifier le code ici
## tabcol.toto = toto[i]
# attributs standards pour toutes les variables
tabcol.units = units[i]
tabcol.long_name = long_name[i]
tabcol.standard_name = standard_name[i]
#cas particuliers attributs specifiques a certaines variables
if (col=="Latitude"):
tabcol.axis="Y"
if (col=="Longitude"):
tabcol.axis="X"
if (col=="Depth" or col=="Profondeur"):
tabcol.axis="Z"
## cas des valeurs en chaines de caracteres : elles sont traitées différement
if ( frmt[i][0] =='S'):
value=csvdata[col]
print("valeur ",value.values[0])
l=len(value.values[0])
print("** longueur tableau: ",len(value),"long chaine ",l)
tabcol._Encoding = 'ascii'
datain = np.array(csvdata[col].values,dtype=frmt[i])
print("data IN ",datain)
## ecriture des valeurs dans les tableaux
x = pd.Series(dateHeure)
if (col=='Date'):
if (col=='Date'):
tabcol[:] = dateHeure# cas particulier ecriture des valeurs de temps dans la variable NetCDF
tabcol.origin = NC_TIME_ORIGIN
else:
tabcol[:] = csvdata[col].tolist() # on ecrit les valeurs des colonnes du fichier CSV dans le tableau de la variable NetCDF
print("*** ",csvdata[col].values)
if ( frmt[i][0] =='S'):
tabcol[:] = datain
else:
tabcol[:] = csvdata[col].tolist() # on ecrit les valeurs des colonnes du fichier CSV dans le tableau de la variable NetCDF
i += 1
print('Variables OK')
cprint('Variables OK', color='green', attrs=['bold'])
return 1
##
def Create_Station_Variable():
def Create_Variable_Station():
#Creation de la variable station name (cas particulier|fausse dimension)
station_name = ncFile.createVariable('station_name', 'S1', 'lenstation')
station_name.long_name = "station_name"
station_name.cf_role = featuretype+"_id"
station_name[:] = nc.stringtoarr(stationname,len(stationname))
return 0
##
def Create_Global_Attributes(ncFile):
# with ncFile:
# metadata du fichier NC lues dans un fichier CSV externe
ncFile.rfa = glob_att.iloc[0, 1]
ncFile.license = glob_att.iloc[1, 1]
ncFile.summary = glob_att.iloc[2, 1]
ncFile.lineage = glob_att.iloc[3, 1]
ncFile.project = glob_att.iloc[4, 1]
ncFile.description = glob_att.iloc[5, 1]
ncFile.title = glob_att.iloc[6, 1]
ncFile.keywords = glob_att.iloc[7, 1]
ncFile.comments = glob_att.iloc[8, 1]
ncFile.history = glob_att.iloc[9, 1]
# Creation des global attributs/metadata du fichier NC lues dans un fichier CSV externe
ncFile.rfa = Index_Selector_Metadata('rfa') #glob_att.loc[index].to_string()
ncFile.license = Index_Selector_Metadata('license')
ncFile.summary = Index_Selector_Metadata('summary')
ncFile.lineage = Index_Selector_Metadata('lineage')
ncFile.project = Index_Selector_Metadata('project')
ncFile.description = Index_Selector_Metadata('description')
ncFile.title = Index_Selector_Metadata('title')
ncFile.keywords = Index_Selector_Metadata('keywords')
ncFile.comments = Index_Selector_Metadata('comment')
ncFile.history = Index_Selector_Metadata('history')
ncFile.featuretype = featuretype
ncFile.cdm_data_type = featuretype
ncFile.conventions = Index_Selector_Metadata('conventions')
#traite le cas particulier featuretype
if featuretype =='timeserie':
ncFile.cdm_timeserie_variables = glob_att.iloc[12, 1]
ncFile.cdm_timeserie_variables = Index_Selector_Metadata('cdm_timeserie_variables')
elif featuretype =='profile':
ncFile.cdm_profile_variables = glob_att.iloc[12, 1]
ncFile.cdm_profile_variables = Index_Selector_Metadata('cdm_profile_variables')
elif featuretype =='trajectory':
ncFile.cdm_trajectory_variables = glob_att.iloc[12, 1]
ncFile.conventions = glob_att.iloc[13, 1]
print('Global Attributs OK')
ncFile.cdm_trajectory_variables = Index_Selector_Metadata('cdm_trajectory_variables')
else:
cprint("Erreur le featuretype est mal defini ", color='red', attrs=['bold'])
sys.exit(0)
cprint('Global Attributs OK', color='green', attrs=['bold'])
return 0
##
def Control_Attributes():
gb_att = glob_att.values
print("feature type ",featuretype)
def Control_Global_Attributes():
#Test s'il existe bien dans notre ficher csv metadata les 4 colonnes importante featuretype|conventions...
gb_att = glob_att.index
#print("feature type ",featuretype)
if ( ('featuretype' in gb_att) and ('cdm_data_type' in gb_att) and ('conventions' in gb_att) ):
print("Control OK")
cprint("Control Attributes OK", color='green', attrs=['bold'])
if (featuretype=="timeserie"):
if ('cdm_timeserie_variables' not in gb_att):
print("il manque cdm_timeserie_variables")
cprint("il manque cdm_timeserie_variables", color='red', attrs=['bold'])
sys.exit(0)
elif (featuretype=="profile"):
if ('cdm_profile_variables' not in gb_att):
print("il manque cdm_profile_variables")
cprint("il manque cdm_profile_variables", color='red', attrs=['bold'])
sys.exit(0)
else:
print("Control failed! \nIl manque featuretype|cdm_data_type|cdm_timeserie_variables|conventions dans le fichier global_attributs")
cprint("Control failed! \nIl manque featuretype|cdm_data_type|cdm_timeserie_variables|conventions dans le fichier:"+fileMetaData, color='red', attrs=['bold'])
sys.exit(0)
return 0
##
def Control_Illegal_char():
Illegal_char=['#','|',',',"'","''","/"]
for elements in Illegal_char:
for columns in cols:
if(elements in columns):
cprint('** Caractère interdit trouvé dans la column du nom:'+columns, color='red', attrs=['bold'])
sys.exit(0)
cprint("Noms des colonnes ok", color='green', attrs=['bold'])
return 0
##
def Control_Header_Columns():
#Controle si les columns date|latitude|longitude existe bien dans le fichier csv
if ('Date' in cols) and ('Latitude' in cols) and ('Longitude' in cols):
cprint("Control Columns OK", color='green', attrs=['bold'])
else:
cprint("Control failed!\nIl manque la Date|Latitude|Longitude dans votre fichier :"+fic, color='red', attrs=['bold'])
sys.exit(0)
return 0
### Programme Principal
###
......@@ -221,59 +312,61 @@ if __name__ == "__main__":
global csvheader, csvdata
global stationname, lenstation, OutputPath
global glob_att,featuretype
global ncFile
global ncFile,fic
global cols
station_name='frioul'
var_dimension='Depth'
NC_TIME_FMT = 'seconds since 1970-01-01 00:00:00 UTC'
NC_TIME_ORIGIN = "01-JAN-1970 00:00:00"
# ========== Read CSV file =============
'''
csvfile = input("Please type the csv file's name (with extension .csv) " )
try:
test = open(csvfile)
test .close()
print("The file exists in your current directory")
except IOError:
print("The file that you are trying to reach is unavailable in your current directory")
'''
InputPath="./CsvFiles/"
OutputPath="./NcFiles/"
fileMetaData = "global_attributes.csv"
parser = argparse.ArgumentParser(description='-s delimiter of the csv file ')
parser.add_argument('-s', '--separator', help='Please enter a separator for you csvFile', required=True)
parser.add_argument('-n', '--name', help='Please enter the name of the station', required=False)
args = parser.parse_args()
allfiles = os.listdir(InputPath)
for fic in allfiles:
if fic.endswith(".csv"):
print("traitement fichier ", fic)
cprint("Traitement fichier "+fic, color='blue', attrs=['bold'])
parser = argparse.ArgumentParser(description='-s delimiter of the csv file ')
parser.add_argument('-s', '--separator', help='Please enter a separator for you csvFile', required=True)
parser.add_argument('-n', '--name', help='Please enter the name of the station', required=True)
args = parser.parse_args()
stationname=args.name
lenstation=len(stationname)
print('station name:',stationname)
print('longueur ',len(stationname))
n=args.name
if (n == None ):
cprint("Donnez le nom de la station pour le fichier "+fic, color='yellow', attrs=['bold'])
stationname=input()
else:
stationname = args.name
lenstation = len(stationname)
csvdata = pd.read_csv(InputPath+fic, sep=',', skiprows=[1, 2, 3, 4, 5],index_col=0) # rendre parametrable cette entete
csvheader = pd.read_csv(InputPath+fic, sep=args.separator,index_col=0)
glob_att = pd.read_csv(fileMetaData, delimiter='=', header=None, index_col=None)
# print("Dimension ",dimension)
indexdrop=csvheader.index.dropna() #cette ligne selectionne le header en supprimant toute la valeur vide(NAN)
csvdata=pd.read_csv(InputPath+fic, sep=args.separator,skiprows=range(1,len(indexdrop)+1),index_col=0)
print('test:\n',csvdata)
cols = csvdata.columns.values
#print(" cols ",cols)
Control_Header_Columns()
Control_Illegal_char()
glob_att = pd.read_csv(fileMetaData, delimiter='=', header=None, index_col=0)
# retourne le type de donnees netcdf : timeserie ou profile ou trajectory
featuretype = Index_Selector_Metadata('featuretype')
Control_Global_Attributes()
#
dimension = Get_dimension()
featuretype = glob_att.iloc[10, 1]
#
ncFile = Generate_NetCDF(OutputPath+fic)
Create_dimensions(dimension)
Create_Global_Attributes(ncFile)
Control_Attributes()
Create_Station_Variable()
#
Create_Variable_Station()
#
Create_Write_Variables(dimension, fic)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment