Expiring Todayâ€”Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# Position in String and YES/NO (Sorry will add points tomorrow)

Posted on 2000-05-10
Medium Priority
249 Views
Have input for \$fields[11] like so:
ALT DEV/EXCURSION FROM ASSIGNED;ACFT EQUIPMENT PROBLEM/CRITICAL

Have the following loop reading input:

while(<IN>){

@anomalies=split(/;/,\$fields[11]);
\$position=0;
\$i=1;
#LIST OF ANOMALIES
\$1="NO";   #ACFT EQUIPMENT PROBLEM/CRITICAL
\$2="NO";   #ACFT EQUIPMENT PROBLEM/LESS SEVERE
\$3="NO";   #ALT DEV/EXCURSION FROM ASSIGNED
\$4="NO";   #ALT DEV/OVERSHOOT ON CLB OR DES
for(\$i;\$i< 4;\$i++){
\$number++;
if(@anomalies[i]="ACFT EQUIPMENT PROBLEM/CRITICAL"){
\$1="YES";
@position[\$number];
}
elsif(@anomalies[i]="ACFT EQUIPMENT PROBLEM/CRITICAL"){
\$2="YES";
@position[\$number];
}
elseif(@anomalies[i]="ACFT EQUIPMENT PROBLEM/LESS SEVERE"){
\$3="YES";
@position[\$number];
}
else(@anomalies[i]="ALT DEV/EXCURSION FROM ASSIGNED"){
\$4="YES";
@position[\$number];
}
}

print OUT "\$1|\$position[\$number]|\$2|\$position[\$number]|\$3|\$position[\$number]|\$4|\$position[\$number]";

}

The line of input in the example should print

YES|2|NO|0|YES|1|NO|0

Yes means the anomaly is present in the string and
the

How would u correct the code to properly produce the output.
0
Question by:tomatocans
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 2
• 2

Author Comment

ID: 2798149
Also there are 66,000 or so lines of input
for \$field[11] and 30 anomalies so the position
of the aomalies can't be hardcoded.

I will ADD 200 points tomorrow
0

LVL 12

Expert Comment

ID: 2798188
The following codes should satisties your new requirement. Do you have some sample data?

#!/usr/local/bin/perl

\$lst  = "ACFT EQUIPMENT PROBLEM/CRITICAL";
\$lst .= ":ACFT EQUIPMENT PROBLEM/CRITICAL";
\$lst .= ":ACFT EQUIPMENT PROBLEM/LESS SEVERE";
\$lst .= ":ALT DEV/EXCURSION FROM ASSIGNED";

@a = split /:/, \$lst;
\$c[0] = "ALT DEV/EXCURSION FROM ASSIGNED;ACFT EQUIPMENT PROBLEM/CRITICAL";
\$c[1] = "ALT DEV/EXCURSION FROM ASSIGNED;ACFT EQUIPMENT PROBLEM/CRITICAL";
\$c[1] .= "; ;ALT DEV/OVERSHOOT ON CLB OR DES";
\$c[3] = " ; ; ;ALT DEV/EXCURSION FROM ASSIGNED";
\$rst = "";

@b = ();   # will contains counts
# \$i - record the positions of anomalies
# while(<IN>){
for \$j (0..\$#c) {
# @anomalies=split(/;/,\$fields[11]);
@anomalies=split(/;/,\$c[\$j]);
for \$i (0..\$#anomalies) {    # check each field
for \$k (0..\$#a) {        # against a list of anomalies
if ("\$anomalies[\$i]" eq "\$a[\$k]") { ++\$b[\$i]; }
}
}
}
# }
for \$i (0..\$#b) {
if (\$b[\$i] > 0) {
if (\$rst) { \$rst .= "|YES|" . \$b[\$i];
} else    { \$rst  = "YES|" . \$b[\$i]; }
} else {
if (\$rst) { \$rst .= "|NO|0"; } else { \$rst = "NO|0"; }
}
}
# print OUT "\$rst\n";
print "\$rst\n";

# The line of input in the example should print
# NO|0|YES|2|NO|0|YES|1
0

LVL 12

Expert Comment

ID: 2798232
I do not know what position you want: anomalies in the input line or anomalies in the list such as in @a?

If it is the position in anomaly list, just change the subscript in \$b[] from \$i to \$k in the first for loop.

I have done a lot of similiar data processing. Post some data sample, I will get more sense what you are doing.

0

LVL 16

Expert Comment

ID: 2800498
tomatocans,

i have a Q. can the string contain the same substring twice ??

Eg.
ALT DEV/EXCURSION FROM ASSIGNED;ACFT EQUIPMENT PROBLEM/CRITICAL;ALT
DEV/EXCURSION FROM ASSIGNED

if yes, what should the result be in this case since the sub-string ALT DEV/EXCURSION FROM
ASSIGNED appears at position 1 and 3!!

if the answer is no, i have a solution ready for you.
0

Author Comment

ID: 2800530
The answer is no it is not in the substring twice.
0

LVL 16

Accepted Solution

maneshr earned 100 total points
ID: 2800534

========tcans.pl
#!/usr/local/bin/perl

\$fields[11]="ALT DEV/EXCURSION FROM ASSIGNED;ACFT EQUIPMENT PROBLEM/CRITICAL";
@anomalies=split(/\;/,\$fields[11]);
\$number=0;
\$i=1;
#LIST OF ANOMALIES
\$one="NO";   #ACFT EQUIPMENT PROBLEM/CRITICAL
\$two="NO";   #ACFT EQUIPMENT PROBLEM/LESS SEVERE
\$three="NO";   #ALT DEV/EXCURSION FROM ASSIGNED
\$four="NO";   #ALT DEV/OVERSHOOT ON CLB OR DES

\$count{'one'}=0;
\$count{'two'}=0;
\$count{'three'}=0;
\$count{'four'}=0;
#foreach(@anomalies){
foreach(\$[ .. \$#anomalies){
if (\$anomalies[\$_] eq "ACFT EQUIPMENT PROBLEM/CRITICAL"){
\$one="YES";
\$count{'one'}=(\$_+1);
}elsif (\$anomalies[\$_] eq "ACFT EQUIPMENT PROBLEM/LESS SEVERE"){
\$two="YES";
\$count{'two'}=(\$_+1);
}elsif (\$anomalies[\$_] eq "ALT DEV/EXCURSION FROM ASSIGNED"){
\$three="YES";
\$count{'three'}=(\$_+1);
}elsif (\$anomalies[\$_] eq "ALT DEV/OVERSHOOT ON CLB OR DES"){
\$four="YES";
\$count{'four'}=(\$_+1);
}
}

print "\$one|\$count{'one'}|\$two|\$count{'two'}|\$three|\$count{'three'}|\$four|\$count{'four'}\n";
0

Author Comment

ID: 2802549
Adjusted points from 0 to 25
0

Author Comment

ID: 2802550
Thanks
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many time we need to work with multiple files all together. If its windows system then we can use some GUI based editor to accomplish our task. But what if you are on putty or have only CLI(Command Line Interface) as an option to  edit your files. Iâ€¦
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command â€¦
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: Tâ€¦
Six Sigma Control Plans
###### Suggested Courses
Course of the Month11 days, 3 hours left to enroll