x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 253

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

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
tomatocans
• 4
• 2
• 2
1 Solution

Author Commented:
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

Commented:
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

Commented:
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

Commented:
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 Commented:
The answer is no it is not in the substring twice.
0

Commented:

========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 Commented:
Adjusted points from 0 to 25
0

Author Commented:
Thanks
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.