Concord/dci2csv
From S23Wiki
here is a little script i wrote to change DCI rules foles to csv formated files.
#!/bin/perl
use strict;
use warnings;
use Getopt::Long;
Getopt::Long::config qw(no_ignore_case);
my ( $inputFile, $outputAllFields, $searchKey, $outputFields );
our @foundSegments;
{
$outputFields = 'name,deviceSpeedIn,deviceSpeedOut';
my $needHelp;
GetOptions( 'dciInFile=s' => \$inputFile,
'findField=s' => \$searchKey,
'showFields=s' => \$outputFields,
'listAllFields' => \$outputAllFields,
'help|h|H|?|HELP' => \$needHelp
);
die usage() if $needHelp;
}
############################################################
# Data collection
# using an input file
# else quit
############################################################
if ($inputFile){
findVars($inputFile);
} else {
die usage()
}
############################################################
# Data output
# if request for keys print all keys
# else print results
############################################################
if ($outputAllFields) {
foreach ( @foundSegments ) {
foreach (keys %$_) {
print "$_, ";
}
print "\n";
}
} else {
foreach my $found (@foundSegments) {
foreach my $showKey (split /,/, $outputFields) {
print "$found->{$showKey},";
}
print "\n";
}
}
sub usage {
return <<USAGETEXT;
usage: $0 -dciInFile filename
-dciInFile filename is the dci file you want to scan
the following options are also availble
[ -findField fieldName ] this is the search key to be used (by default all elements will be returned)
[ -showFields field names ] feilds to output (default is name,deviceSpeedIn,deviceSpeedOut)
[ -listAllFields ] list avalible fields
[ -help] this help text
USAGETEXT
}
sub findVars {
############################################################
# find infomation form Concord's dci files
# usage:
# findVars("key to search in","value to search for")
#
# output:
# an aray of Hashes containing all matched segments and keys
############################################################
my ($dciFile, $segmentFieldKey, %segment, $segmentFieldValue, %segmentFields, $nullVar);
my $inElementSection;
# read in dci filename from parent
$dciFile=$_[0] || die qq( FindVars function: Missing dciInfile value $!);
chomp $dciFile;
open(DCIFILE, "<$dciFile") || die "FindVars function: can not open : $!";
foreach my $line (<DCIFILE>) {
chomp $line;
if ( $line =~ /^FN,Elements,/ ) {
$line =~ s/FN\,Elements\,//g;
our $i="0";
foreach (split(/\,/,$line)) {
$i++;
$segmentFields{ $i } = $_;
}
next;
};
if ( $line =~ /^DS,,Elements,/ ) {$inElementSection=1; next;} #marks start of elements
if ( $line =~ /^DE/ ) {$inElementSection=0; next;} #marks end of elements
if ($inElementSection==1) {
our $ii="0";
foreach (split(/\,/,$line)) {
if ($_ =~ /^$/) {$segment{$segmentFields{$ii}}="void";}
$ii++;
$segment{$segmentFields{$ii}}=$_;
}
push @foundSegments,{%segment};
next;
}
}
close DCIFILE;
return (@foundSegments); # return to main ruteen
}
Categories: Concord | Computer | English

