Ignore:
Timestamp:
Nov 8, 2005, 5:16:44 PM (20 years ago)
Author:
ansari
Message:

1/ Prise en charge champ de type DateTimeField ds BaseDataTable , DataTable, SwPPFDataTable
2/ Methodes BaseDataTable completees - en particulier Print/WriteASCII, et
decodage de fichiers ASCII

Reza, 8 Nov 2005

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/basedtable.cc

    r2827 r2831  
    1111*/
    1212
     13/*!
     14  if fgl == true , return LongForm string
     15  \verbatim
     16  ---------------------------------------------- 
     17  FieldType         ShortForm     LongForm
     18  ---------------------------------------------- 
     19  IntegerField          I         Integer
     20  LongField             L         Long Integer
     21  FloatField            F         Float
     22  DoubleField           D         Double
     23  ComplexField         Zx4        Complex
     24  DoubleComplexField   Zx8        DoubleComplex
     25  StringField           S         String
     26  DateTimeField         T         DateTime
     27  ---------------------------------------------- 
     28  \endverbatim
     29*/
    1330string BaseDataTable::ColTypeToString(FieldType ft, bool fgl)
    1431{
     
    4360    else rs = "S";
    4461    break;
    45   case DateField :
     62  case DateTimeField :
    4663    if (fgl) rs = "DateTime";
    4764    else rs = "T";
     
    5269  }
    5370  return rs;
     71}
     72
     73BaseDataTable::FieldType BaseDataTable::StringToColType(string const & sctyp)
     74{
     75  if ( (sctyp == "Integer") || (sctyp == "I") )  return IntegerField;
     76  else if ( (sctyp == "Long Integer") || (sctyp == "L") )  return LongField;
     77  else if ( (sctyp == "Float") || (sctyp == "F") )  return FloatField;
     78  else if ( (sctyp == "Double") || (sctyp == "D") )  return DoubleField;
     79  else if ( (sctyp == "Complex") || (sctyp == "Zx4") )  return ComplexField;
     80  else if ( (sctyp == "DoubleComplex") || (sctyp == "Zx8") || (sctyp == "Z") ) 
     81    return DoubleComplexField;
     82  else if ( (sctyp == "String") || (sctyp == "S") )  return StringField;
     83  else if ( (sctyp == "DateTime") || (sctyp == "T") )  return DateTimeField;
     84  else return DoubleField;
    5485}
    5586
     
    252283}
    253284
     285#define BADVAL -1.e39
     286
     287TVector<r_8> BaseDataTable::GetColumnD(sa_size_t k) const
     288{
     289  if ((k < 0) || (k >= NVar()))
     290    throw RangeCheckError("BaseDataTable::GetColumnD() out of range column index k");
     291  sa_size_t sk = mNames[k].ser;
     292  sa_size_t i = 0;
     293  TVector<r_8> rv(NEntry());
     294
     295  for (sa_size_t is=0; is<NbSegments(); is++) {
     296    switch (mNames[k].type) {
     297    case IntegerField :
     298      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     299        rv(i) = mIColsP[sk]->GetCstSegment(is)[j];
     300      break;
     301    case LongField :
     302      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     303        rv(i) = mLColsP[sk]->GetCstSegment(is)[j];
     304      break;
     305    case FloatField :
     306      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     307        rv(i) = mFColsP[sk]->GetCstSegment(is)[j];
     308      break;
     309    case DoubleField :
     310    case DateTimeField :
     311      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     312        rv(i) = mDColsP[sk]->GetCstSegment(is)[j];
     313      break;
     314    case ComplexField :
     315      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     316        rv(i) = mYColsP[sk]->GetCstSegment(is)[j].real();
     317      break;
     318    case DoubleComplexField :
     319      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     320        rv(i) = mZColsP[sk]->GetCstSegment(is)[j].real();
     321      break;
     322    case StringField :
     323      for(sa_size_t j=0; j<SegmentSize(); j++,i++)
     324        rv = atof(mSColsP[sk]->GetCstSegment(is)[j].c_str());
     325      break;
     326    default:
     327      for(sa_size_t j=0; j<SegmentSize(); j++,i++)  rv(i) = BADVAL;
     328      break;
     329    }
     330  }
     331  return rv ;
     332}
     333
    254334void BaseDataTable::CopyMerge(BaseDataTable const& a, bool cp)
    255335{
     
    276356}
    277357
    278 void BaseDataTable::Print(int num, int nmax) const
    279 {
    280   // A faire
    281   return;
     358/*!
     359  Formatted (text) output of the table, for lines lstart <= l_index < lend , with step lstep
     360  \param os : output stream (formatted output)
     361  \param lstart : start row (line) index
     362  \param lend : end row (line) index
     363  \param lstep : row index increment
     364*/
     365ostream& BaseDataTable::Print(ostream& os, sa_size_t lstart, sa_size_t lend, sa_size_t lstep) const
     366{
     367  os << "##### BaseDataTable::Print() - Table(NRow=" << NEntry() << " , NCol="
     368     << NVar() << ") ##### " << endl;
     369  os << "#! " ;
     370  for (size_t i=0; i<NVar(); i++) {
     371    string nom = mNames[i].nom;
     372    nom += ':'; nom += ColTypeToString(mNames[i].type);
     373    os << setw(12) << nom << " ";
     374  }
     375  os << endl;
     376  os << "##########################################################################" << endl;
     377  for (sa_size_t l=lstart; l<lend; l+=lstep)
     378    os << TableRowToString(l, true) << endl;
     379  return os;
    282380}
    283381
     
    312410}
    313411
    314 //! NOT YET IMPLEMENTED ! - Fills table from an ascii file
    315 int    BaseDataTable::FillFromASCIIFile(string const& fn)
    316 //      Remplit le ntuple a partir d'un fichier ASCII.
    317 //      Renvoie le nombre de lignes ajoutees.
    318 {
    319 // a faire
    320 return(0);
     412//! Fills table from an ascii (text) file
     413/*
     414  Return number of non empt lines (added to table)
     415  \param is : input ascii (text) stream
     416  \param clm : Lines starting with clm are ignored (comments)
     417  \param sep : separator between different fields (columns)
     418*/
     419sa_size_t  BaseDataTable::FillFromASCIIFile(istream& is, char clm, const char* sep)
     420{
     421  string str;
     422  if (mVarMTV == NULL) mVarMTV = new MuTyV[NVar()];
     423  sa_size_t iv, nl;
     424  nl = 0;
     425  while (!is.eof()) {
     426    str = "";
     427    getline(is, str);
     428    if (is.good() || is.eof()) {
     429      size_t l = str.length();
     430      if ((l == 0) || (str[0]==clm)) continue;
     431      for(iv=0; iv<NVar(); iv++) mVarMTV[iv] = 0.;
     432      iv = 0;
     433      size_t q = 0;
     434      size_t p = 0;
     435      while ( (q < l) && (iv < NVar()) ) {
     436        p = str.find_first_not_of(sep,q);
     437        if (p >= l)  break;
     438        if (str[p] == '\'')    {  // Decodage d'un string
     439          q = str.find('\'',p+1);
     440          if (q < l)  {
     441            mVarMTV[iv] = str.substr(p+1,q-p-1);
     442            q++;
     443          }
     444          else mVarMTV[iv] = str.substr(p+1,l-p-1);
     445          iv++;
     446        }
     447        else {
     448          q = str.find_first_of(sep,p);
     449          if (q > l) q = l;
     450          mVarMTV[iv] = str.substr(p,q-p);
     451          iv++;
     452        }
     453        if (mNames[iv-1].type == DateTimeField) {
     454          string tts = (string)mVarMTV[iv-1];
     455          mVarMTV[iv-1] = TimeStamp(tts);
     456        }
     457      }
     458      AddLine(mVarMTV);
     459      nl++;
     460    }
     461  }  // Fin boucle lignes fichier
     462  cout << "BaseDataTable::FillFromASCIIFile()/Info: " << nl << " lines decoded from stream " << endl;
     463  return(nl);
    321464}
    322465
     
    364507}
    365508
    366 #define BADVAL -1.e39
    367509
    368510r_8  BaseDataTable::GetCell(sa_size_t n, sa_size_t k) const
     
    388530    break;
    389531  case DoubleField :
    390   case DateField :
    391    rv = mDColsP[sk]->GetCstSegment(bid)[off];
     532  case DateTimeField :
     533    rv = mDColsP[sk]->GetCstSegment(bid)[off];
    392534    break;
    393535  case ComplexField :
     
    445587    rv = mSColsP[sk]->GetCstSegment(bid)[off];
    446588    break;
     589  case DateTimeField :
     590    rv = TimeStamp(mDColsP[sk]->GetCstSegment(bid)[off]);
     591    break;
    447592  default:
    448593    rv = " ";
     
    511656    break;
    512657  case DoubleField :
     658  case DateTimeField :
    513659    for(size_t is=0; is<mDColsP[sk]->NbSegments(); is++) {
    514660      const r_8* sp = mDColsP[sk]->GetCstSegment(is);
     
    608754  for(int i=0; i<NVar(); i++) {
    609755    s = mNames[i].nom;
    610     s += ' ';
    611756    size_t l = s.length();
    612     for(size_t ii=l; ii<10; ii++) s += ' ';
     757    for(size_t ii=l; ii<12; ii++) s += ' ';
     758    if (i > 0) rets += ' ';   
    613759    rets += s;
    614760  }
     
    616762}
    617763
    618 
    619 string BaseDataTable::LineToString(sa_size_t n) const
     764/*!
     765  Return a table row (line) as a string
     766  \sa TableRowToString()
     767*/
     768string BaseDataTable::LineToString(sa_size_t n) const
     769{
     770  return TableRowToString(n, false);
     771}
     772
     773/*!
     774  \param n : table row index ( 0 ... NEntry()-1)
     775  \param qstr : if true , enclose strings in quotes ''
     776  \param sep : separates fields using \b sep
     777  \param fw : minimum field width
     778 */
     779string BaseDataTable::TableRowToString(sa_size_t n, bool qstr,
     780                                       const char* sep, int fw) const
    620781{
    621782  if ((n < 0) || (n >= NEntry()))
     
    648809    case StringField :
    649810      rv = mSColsP[sk]->GetCstSegment(bid)[off];
    650     break;
     811      break;
     812    case DateTimeField :
     813      rv = TimeStamp(mDColsP[sk]->GetCstSegment(bid)[off]);
     814      break;
    651815    default:
    652816      rv = " ";
    653817      break;
    654818    }
    655     string s = (string)rv;
    656     s += ' ';
     819    string s;
     820    if ( (mNames[k].type == StringField) && (qstr) ) {
     821      s = '\'';  s += (string)rv; s += '\'';
     822    }
     823    else  s= (string)rv;
    657824    size_t l = s.length();
    658     for(size_t ii=l; ii<10; ii++) s += ' ';
     825    for(size_t ii=l; ii<fw; ii++) s += ' ';
     826    if (k > 0) rs += sep;
    659827    rs += s;
    660828  }
Note: See TracChangeset for help on using the changeset viewer.