Changeset 19878


Ignore:
Timestamp:
Nov 30, 2019, 3:07:23 PM (10 months ago)
Author:
tbretz
Message:
Branches must always be written, branch names must not start with a dot, added more possible delimiters, the default is now to read from stdin.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/csv2root.cc

    r19802 r19878  
    2626    po::options_description control("Root to SQL");
    2727    control.add_options()
    28         ("file",           var<string>()->required(), "The csv input file")
     28        ("file",           var<string>("-"),          "The csv input file. The default ('-') is reading from stdin.")
    2929        ("out,o",          var<string>(""),           "Output root file name")
    3030        ("force,f",        po_switch(),               "Force overwrite if output file already exists.")
     
    3434        ("no-header,n",    po_switch(),               "Use if the first line contains no header")
    3535        ("rename.*",       var<string>(),             "Can be used to rename a column")
     36        ("delimiter",      var<string>(";:, \t"),     "List of possible delimiters")
    3637        ("dry-run",        po_switch(),               "Do not create or manipulate any output file")
    3738        ("verbose,v",      var<uint16_t>(1),          "Verbosity (0: quiet, 1: default, 2: more, 3, ...)")
     
    148149//    const bool dryrun            = conf.Get<bool>("dry-run");
    149150    const bool noheader          = conf.Get<bool>("no-header");
     151    const string delimiter       = conf.Get<string>("delimiter");
    150152
    151153    const uint16_t verbose       = conf.Get<uint16_t>("verbose");
     
    158160    if (out.empty())
    159161    {
    160         out = file;
     162        out = file.empty() || file=="-" ? "csv2root" : file;
    161163        const auto p = out.find_last_of('.');
    162164        if (p!=string::npos)
    163             out = string(out.substr(0, p))+".root";
     165            out.erase(p);
     166        out += ".root";
    164167    }
    165168
     
    179182    cout << "Reading from '" << file << "'.\n";
    180183
    181     ifstream fin(file.c_str());
     184    ifstream ifs(file.c_str());
     185
     186    istream &fin = file=="-" ? cin : ifs;
    182187    if (!fin.good())
    183188    {
     
    195200
    196201    buf = buf.Strip(TString::kBoth);
    197     TObjArray *title = buf.Tokenize(" ");
     202    TObjArray *title = buf.Tokenize(delimiter);
    198203    if (title->GetEntries()==0)
    199204    {
     
    203208
    204209    if (title->At(0)->GetName()[0]=='#')
     210    {
    205211        title->RemoveAt(0);
     212        title->Compress();
     213    }
    206214
    207215    const auto numcol = title->GetEntries();
     
    280288        }
    281289    }
    282 
    283290    const auto rename = conf.GetWildcardOptions("rename.*");
    284291
     
    293300        boost::regex rexpr(":");
    294301        col = boost::regex_replace(col, rexpr, "");
     302
     303        if (col[0]=='.')
     304            col.erase(0, 1);
    295305
    296306        if (verbose>1)
     
    333343            continue;
    334344
    335         TObjArray *arr = buf.Tokenize(" ");
     345        TObjArray *arr = buf.Tokenize(delimiter);
    336346        if (arr->GetEntries()!=numcol)
    337347        {
     
    369379    for (auto it=ttree.begin(); it!=ttree.end(); it++)
    370380    {
    371         if (update)
    372         {
    373             TIter NextBranch((*it)->GetListOfBranches());
    374             TBranch *b=0;
    375             while ((b=static_cast<TBranch*>(NextBranch())))
    376                 if (b->GetAddress() && b->GetEntries()>0)
    377                 {
    378                     (*it)->SetEntries(b->GetEntries());
    379                     break;
    380                 }
    381         }
     381        TIter NextBranch((*it)->GetListOfBranches());
     382        TBranch *b=0;
     383        while ((b=static_cast<TBranch*>(NextBranch())))
     384            if (b->GetAddress() && b->GetEntries()>0)
     385            {
     386                (*it)->SetEntries(b->GetEntries());
     387                break;
     388            }
    382389
    383390        (*it)->Write("", TObject::kOverwrite);
Note: See TracChangeset for help on using the changeset viewer.