Compare commits

...

5 Commits

Author SHA1 Message Date
Mario Fink
08e2589dfd README: fix typo 2021-06-28 16:38:23 +02:00
Mario Fink
d098273816 README.md: udpate to new CLI options 2021-06-28 16:37:16 +02:00
Mario Fink
2f9c550323 bump pip/cython version 1.2.5 2021-06-28 16:33:25 +02:00
Mario Fink
234876c5a9 * cython/*_imc_termite.*: introduce both print_channel/print_channels
methods featuring csv delimiter option
* imc_raw.hpp: add print_channel()
* python/{example.py,usage.py}: adjust to existing sample file names,
  add print_channel() example
* src/main.cpp: add --delimiter option, additional CLI option checks
2021-06-28 16:26:07 +02:00
Mario Fink
bafc018566 CLI version: add option for delimiter token of csv output 2021-06-28 12:51:09 +02:00
11 changed files with 122 additions and 37 deletions

View File

@ -171,14 +171,18 @@ Options:
-c, --listchannels list channels -c, --listchannels list channels
-b, --listblocks list IMC key-blocks -b, --listblocks list IMC key-blocks
-d, --output output directory to print channels -d, --output output directory to print channels
-s, --delimiter csv delimiter/separator char for output
-h, --help show this help message -h, --help show this help message
-v, --version display version -v, --version display version
``` ```
For instance, to show a list of all channels included in `sample-data.raw`, you For instance, to show a list of all channels included in `sample-data.raw`, you
do `imctermite sample-data.raw --listchannels`. No output files are do `imctermite sample-data.raw --listchannels`. No output files are
written by default. Output files are written only when an existing (!) directory is provided as argument to written by default. Output files are written only when an existing (!) directory
the `--output` option. is provided as argument to the `--output` option. By default, every output file
is written using a `,` delimiter. You may provide any custom separator with the
option `--delimiter`. For example, in order to use `|`, the binary is called with
options `imctermite sample-data.raw -b -c -s '|'`.
### Python ### Python
@ -218,4 +222,3 @@ in the Python folder.
- https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html - https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
- https://github.com/Apollo3zehn/ImcFamosFile - https://github.com/Apollo3zehn/ImcFamosFile
- https://pypi.org/help/#apitoken - https://pypi.org/help/#apitoken

View File

@ -14,6 +14,7 @@ cdef extern from "imc_raw.hpp" namespace "imc":
void set_file(string rawfile) except + void set_file(string rawfile) except +
# get JSON list of channels # get JSON list of channels
vector[string] get_channels(bool json, bool data) except + vector[string] get_channels(bool json, bool data) except +
# print all channels # print single channel/all channels
void print_channels(string outputdir) except + void print_channel(string channeluuid, string outputdir, char delimiter) except +
void print_channels(string outputdir, char delimiter) except +
void print_table(string outputfile) except + void print_table(string outputfile) except +

View File

@ -25,9 +25,11 @@ cdef class imctermite:
chnlstjn = [jn.loads(chn.decode(errors="ignore")) for chn in chnlst] chnlstjn = [jn.loads(chn.decode(errors="ignore")) for chn in chnlst]
return chnlstjn return chnlstjn
# print channels # print single channel/all channels
def print_channels(self, string outputdir): def print_channel(self, string channeluuid, string outputfile, char delimiter):
self.cpp_imc.print_channels(outputdir) self.cpp_imc.print_channel(channeluuid,outputfile,delimiter)
def print_channels(self, string outputdir, char delimiter):
self.cpp_imc.print_channels(outputdir,delimiter)
# print table including channels # print table including channels
def print_table(self, string outputfile): def print_table(self, string outputfile):

View File

@ -15,7 +15,7 @@ extensions = Extension(
setup( setup(
name="imc_termite", name="imc_termite",
version='1.2.4', version='1.2.5',
description='IMCtermite cython extension', description='IMCtermite cython extension',
author='Record Evolution GmbH', author='Record Evolution GmbH',
author_email='mario.fink@record-evolution.de', author_email='mario.fink@record-evolution.de',

View File

@ -381,7 +381,7 @@ namespace imc
} }
// print channel // print channel
void print(std::string filename, const char sep = ' ', int width = 25) void print(std::string filename, const char sep = ',', int width = 25)
{ {
std::ofstream fou(filename); std::ofstream fou(filename);

View File

@ -332,14 +332,38 @@ namespace imc
return channels; return channels;
} }
// print all channels in directory // print single specific channel
void print_channels(std::string output) void print_channel(std::string channeluuid, std::string outputfile, const char sep)
{
// check for given parent directory of output file
std::filesystem::path pdf = outputfile;
if ( !std::filesystem::is_directory(pdf.parent_path()) )
{
throw std::runtime_error(std::string("required directory does not exist: ")
+ pdf.parent_path().u8string() );
}
// find channel with given name
if ( channels_.count(channeluuid) == 1 )
{
channels_.at(channeluuid).print(outputfile,sep);
}
else
{
throw std::runtime_error(std::string("channel does not exist:")
+ channeluuid);
}
}
// print all channels into given directory
void print_channels(std::string output, const char sep)
{ {
// check for given directory // check for given directory
std::filesystem::path pd = output; std::filesystem::path pd = output;
if ( !std::filesystem::is_directory(pd) ) if ( !std::filesystem::is_directory(pd) )
{ {
throw std::runtime_error("given directory does not exist"); throw std::runtime_error(std::string("given directory does not exist: ")
+ output);
} }
for ( std::map<std::string,imc::channel>::iterator it = channels_.begin(); for ( std::map<std::string,imc::channel>::iterator it = channels_.begin();
@ -352,7 +376,7 @@ namespace imc
std::filesystem::path pf = pd / filenam; std::filesystem::path pf = pd / filenam;
// and print the channel // and print the channel
it->second.print(pf); it->second.print(pf,sep);
} }
} }

View File

@ -93,7 +93,7 @@ cython-install : check-vtag $(CTAG) $(CYT)setup.py $(CYT)imc_termite.pxd $(CYT)p
cython-clean : cython-clean :
rm -vf imc_termite.cpython-*.so rm -vf imc_termite.cpython-*.so
rm -vf $(PYT)imc_termite.cpython-*.so rm -vf $(PYT)imc_termite.cpython-*.so
rm -rv build/ rm -rvf build/
#-----------------------------------------------------------------------------# #-----------------------------------------------------------------------------#
# pip # pip

View File

@ -6,7 +6,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
setup( setup(
name="IMCtermite", name="IMCtermite",
version="1.2.4", version="1.2.5",
author="Record Evolution GmbH", author="Record Evolution GmbH",
author_email="mario.fink@record-evolution.de", author_email="mario.fink@record-evolution.de",
maintainer="Record Evolution GmbH", maintainer="Record Evolution GmbH",

View File

@ -7,16 +7,16 @@ import pyarrow as pa
import pyarrow.parquet as pq import pyarrow.parquet as pq
from pathlib import Path from pathlib import Path
fileobj1 = Path("smp/Rangerover_Evoque_F-RR534_2019-05-07/").rglob("*.raw") fileobj1 = Path("samples/datasetA/").rglob("*.raw")
rawlist1 = [str(fl) for fl in fileobj1] rawlist1 = [str(fl) for fl in fileobj1]
fileobj2 = Path("smp/Mercedes_E-Klasse-2019-08-08/").rglob("*.raw") fileobj2 = Path("samples/datasetB/").rglob("*.raw")
rawlist2 = [str(fl) for fl in fileobj2] rawlist2 = [str(fl) for fl in fileobj2]
rawlist = rawlist1 #[rawlist1[0],rawlist1[4],rawlist2[0],rawlist2[6]] rawlist = rawlist1 #[rawlist1[0],rawlist1[4],rawlist2[0],rawlist2[6]]
for fil in rawlist2 : for fil in rawlist2 :
rawlist.append(fil) rawlist.append(fil)
rawlist.append("smp/pressure_Vacuum.asc") rawlist.append("./README.md")
print("") print("")
print(rawlist) print(rawlist)

View File

@ -1,10 +1,11 @@
import imc_termite import imc_termite
import json import json
import os
# declare and initialize instance of "imctermite" by passing a raw-file # declare and initialize instance of "imctermite" by passing a raw-file
try : try :
imcraw = imc_termite.imctermite(b"samples/sampleA.raw") imcraw = imc_termite.imctermite(b"samples/exampleB.raw")
except RuntimeError as e : except RuntimeError as e :
raise Exception("failed to load/parse raw-file: " + str(e)) raise Exception("failed to load/parse raw-file: " + str(e))
@ -22,7 +23,16 @@ print(len(chnydata))
print(len(chnxdata)) print(len(chnxdata))
# print the channels into a specific directory # print the channels into a specific directory
imcraw.print_channels(b"./") imcraw.print_channels(b"./data",ord(','))
# print all channels separately
idx = 0
for chn in channels :
print(str(idx)+" : "+chn['name']+" : "+chn['uuid'])
filname = os.path.join("./data",str(idx) + "_" + chn['name']+".csv")
print(filname)
imcraw.print_channel(chn['uuid'].encode(),filname.encode(),ord(','))
idx = idx + 1
# print all channels in single file # print all channels in single file
imcraw.print_table(b"./allchannels.csv") # imcraw.print_table(b"./data/allchannels.csv")

View File

@ -32,25 +32,37 @@ optkeys parse_args(int argc, char* argv[], bool list_args = false)
// parse all CLI arguments // parse all CLI arguments
for ( int i = 1; i < argc; i++ ) for ( int i = 1; i < argc; i++ )
{ {
if ( std::string(argv[i]) == std::string("--showmeta") // if ( std::string(argv[i]) == std::string("--showmeta")
|| std::string(argv[i]) == std::string("-m") ) // || std::string(argv[i]) == std::string("-m") )
{ // {
prsdkeys.insert(std::pair<std::string,std::string>("showmeta",argv[i])); // prsdkeys.insert(std::pair<std::string,std::string>("showmeta",argv[i]));
} // }
// else if ( std::string(argv[i]) == std::string("--listgroups") // else if ( std::string(argv[i]) == std::string("--listgroups")
// || std::string(argv[i]) == std::string("-g") ) // || std::string(argv[i]) == std::string("-g") )
// { // {
// prsdkeys.insert(std::pair<std::string,std::string>("listgroups",argv[i])); // prsdkeys.insert(std::pair<std::string,std::string>("listgroups",argv[i]));
// } // }
else if ( std::string(argv[i]) == std::string("--listchannels") if ( std::string(argv[i]) == std::string("--listchannels")
|| std::string(argv[i]) == std::string("-c") ) || std::string(argv[i]) == std::string("-c") )
{ {
prsdkeys.insert(std::pair<std::string,std::string>("listchannels",argv[i])); prsdkeys.insert(std::pair<std::string,std::string>("listchannels",argv[i]));
if ( i+1 < argc ) {
if ( argv[i+1][0] != '-' ) {
std::cerr<<"option --list-channels does not take any argument\n";
prsdkeys.insert(std::pair<std::string,std::string>("invalid","channels"));
}
}
} }
else if ( std::string(argv[i]) == std::string("--listblocks") else if ( std::string(argv[i]) == std::string("--listblocks")
|| std::string(argv[i]) == std::string("-b") ) || std::string(argv[i]) == std::string("-b") )
{ {
prsdkeys.insert(std::pair<std::string,std::string>("listblocks",argv[i])); prsdkeys.insert(std::pair<std::string,std::string>("listblocks",argv[i]));
if ( i+1 < argc ) {
if ( argv[i+1][0] != '-' ) {
std::cerr<<"option --list-blocks does not take any argument\n";
prsdkeys.insert(std::pair<std::string,std::string>("invalid","listblocks"));
}
}
} }
else if ( std::string(argv[i]) == std::string("--output") else if ( std::string(argv[i]) == std::string("--output")
|| std::string(argv[i]) == std::string("-d") ) || std::string(argv[i]) == std::string("-d") )
@ -66,6 +78,20 @@ optkeys parse_args(int argc, char* argv[], bool list_args = false)
i = i + 1; i = i + 1;
} }
} }
else if ( std::string(argv[i]) == std::string("--delimiter")
|| std::string(argv[i]) == std::string("-s") )
{
if ( i+1 == argc || argv[i+1][0] == '-' )
{
std::cerr<<"invalid or missing --delimiter argument\n";
prsdkeys.insert(std::pair<std::string,std::string>("invalid","delimiter"));
}
else
{
prsdkeys.insert(std::pair<std::string,std::string>("delimiter",argv[i+1]));
i = i + 1;
}
}
else if ( std::string(argv[i]) == std::string("--help") else if ( std::string(argv[i]) == std::string("--help")
|| std::string(argv[i]) == std::string("-h") ) || std::string(argv[i]) == std::string("-h") )
{ {
@ -84,13 +110,13 @@ optkeys parse_args(int argc, char* argv[], bool list_args = false)
std::cerr<<"invalid or unkown argument: "<<argv[i]<<"\n"; std::cerr<<"invalid or unkown argument: "<<argv[i]<<"\n";
prsdkeys.insert(std::pair<std::string,std::string>("invalid",argv[i])); prsdkeys.insert(std::pair<std::string,std::string>("invalid",argv[i]));
} }
// or missing filenames // // or missing filenames
else if ( std::string(argv[i]).find(".raw") == std::string::npos ) // else if ( std::string(argv[i]).find(".raw") == std::string::npos )
{ // {
std::cerr<<"doesn't look like a .raw file (make sure to include extension in filename!): " // std::cerr<<"doesn't look like a .raw file (make sure to include extension in filename!): "
<<argv[i]<<"\n"; // <<argv[i]<<"\n";
prsdkeys.insert(std::pair<std::string,std::string>("invalid",argv[i])); // prsdkeys.insert(std::pair<std::string,std::string>("invalid",argv[i]));
} // }
} }
} }
@ -121,9 +147,13 @@ void show_usage()
<<" -c, --listchannels list channels\n" <<" -c, --listchannels list channels\n"
<<" -b, --listblocks list IMC key-blocks\n" <<" -b, --listblocks list IMC key-blocks\n"
<<" -d, --output output directory to print channels\n" <<" -d, --output output directory to print channels\n"
<<" -s, --delimiter csv delimiter/separator char for output\n"
<<" -h, --help show this help message \n" <<" -h, --help show this help message \n"
<<" -v, --version display version\n" <<" -v, --version display version\n"
<<"\n"; <<"\n"
<<"Example:"
<<" $ ./imctermite sample/data_A.raw -c -b -d ./data -s ','"
<<"\n\n";
} }
//---------------------------------------------------------------------------// //---------------------------------------------------------------------------//
@ -209,7 +239,22 @@ int main(int argc, char* argv[])
if ( cfgopts.count("output") == 1 ) if ( cfgopts.count("output") == 1 )
{ {
try { try {
imcraw.print_channels(cfgopts.at("output")); // check and use desired delimiter
char delim;
if ( cfgopts.count("delimiter") == 1 )
{
if ( cfgopts.at("delimiter").size() > 1 )
{
throw std::runtime_error("invalid delimiter comprised of more than a single char");
}
delim = cfgopts.at("delimiter")[0];
}
// use comma by default
else
{
delim = ',';
}
imcraw.print_channels(cfgopts.at("output"),delim);
} catch (const std::exception& e) { } catch (const std::exception& e) {
std::cerr<<"failed to print channels for "<<rawfile<<": "<<e.what()<<"\n"; std::cerr<<"failed to print channels for "<<rawfile<<": "<<e.what()<<"\n";
} }