Jestem stosunkowo nowy w Perlu i natknąłem się na ten projekt, z którym mam problem. Celem projektu jest porównanie dwóch plików CSV, z których jeden zawiera: $ nazwa, $ model, $ wersja i druga, która zawiera: $ name2, $ disk, $ storage na końcu Plik RESULT będzie zawierał dopasowane linie i zawiera informacje takie jak: $ nazwa, model $, wersja $, dysk $, magazyn $.pomijanie linii w tablicy, Perl
Udało mi się to zrobić, ale moim problemem jest to, że gdy jeden z brakujących elementów zostanie przerwany. Po napotkaniu linii w pliku brakuje elementu zatrzymuje się w tej linii. Jak mogę rozwiązać ten problem? wszelkie sugestie lub sposób, w jaki sposób mogę sprawić, że pominie tę linię i będzie kontynuował?
Oto mój kod:
open(TESTING, '>testing.csv'); # Names will be printed to this during testing. only .net ending names should appear
open(MISSING, '>Missing.csv'); # Lines with missing name feilds will appear here.
#open (FILE,'C:\Users\hp-laptop\Desktop\file.txt');
#my (@array) =<FILE>;
my @hostname; #stores names
#close FILE;
#***** TESTING TO SEE IF ANY OF THE LISTED ITEMS BEGIN WITH A COMMA AND DO NOT HAVE A NAME.
#***** THESE OBJECTS ARE PLACED INTO THE MISSING ARRAY AND THEN PRINTED OUT IN A SEPERATE
#***** FILE.
#open (FILE,'C:\Users\hp-laptop\Desktop\file.txt');
#test
if (open(FILE, "file.txt")) {
}
else {
die " Cannot open file 1!\n:$!";
}
$count = 0;
$x = 0;
while (<FILE>) {
($name, $model, $version) = split(","); #parsing
#print $name;
chomp($name, $model, $version);
if (($name =~ /^\s*$/)
&& ($model =~ /^\s*$/)
&& ($version =~ /^\s*$/)) #if all of the fields are blank (just a blank space)
{
#do nothing at all
}
elsif ($name =~ /^\s*$/) { #if name is a blank
$name =~ s/^\s*/missing/g;
print MISSING "$name,$model,$version\n";
#$hostname[$count]=$name;
#$count++;
}
elsif ($model =~ /^\s*$/) { #if model is blank
$model =~ s/^\s*/missing/g;
print MISSING"$name,$model,$version\n";
}
elsif ($version =~ /^\s*$/) { #if version is blank
$version =~ s/^\s*/missing/g;
print MISSING "$name,$model,$version\n";
}
# Searches for .net to appear in field "$name" if match, it places it into hostname array.
if ($name =~ /.net/) {
$hostname[$count] = $name;
$count++;
}
#searches for a comma in the name feild, puts that into an array and prints the line into the missing file.
#probably won't have to use this, as I've found a better method to test all of the feilds ($name,$model,$version)
#and put those into the missing file. Hopefully it works.
#foreach $line (@array)
#{
#if($line =~ /^\,+/)
#{
#$line =~s/^\,*/missing,/g;
#$missing[$x]=$line;
#$x++;
#}
#}
}
close FILE;
for my $hostname (@hostname) {
print TESTING $hostname . "\n";
}
#for my $missing(@missing)
#{
# print MISSING $missing;
#}
if (open(FILE2, "file2.txt")) { #Run this if the open succeeds
#open outfile and print starting header
open(RESULT, '>resultfile.csv');
print RESULT ("name,Model,version,Disk, storage\n");
}
else {
die " Cannot open file 2!\n:$!";
}
$count = 0;
while ($hostname[$count] ne "") {
while (<FILE>) {
($name, $model, $version) = split(","); #parsing
#print $name,"\n";
if ($name eq $hostname[$count]) # I think this is the problem area.
{
print $name, "\n", $hostname[$count], "\n";
#print RESULT"$name,$model,$version,";
#open (FILE2,'C:\Users\hp-laptop\Desktop\file2.txt');
#test
if (open(FILE2, "file2.txt")) {
}
else {
die " Cannot open file 2!\n:$!";
}
while (<FILE2>) {
chomp;
($name2, $Dcount, $vname) = split(","); #parsing
if ($name eq $name2) {
chomp($version);
print RESULT"$name,$model,$version,$Dcount,$vname\n";
}
}
}
$count++;
}
#open (FILE,'C:\Users\hp-laptop\Desktop\file.txt');
#test
if (open(FILE, "file.txt")) {
}
else {
die " Cannot open file 1!\n:$!";
}
}
close FILE;
close RESULT;
close FILE2;
Następnym razem użyj ścisłego kodu, chroni przed irytującymi błędami. –
Proszę 'użyj ścisłego;', 'użyj ostrzeżenia;', wprowadź wcięcie w kod poprawnie, użyj wersji argumentu open z leksykalnymi uchwytami plików i naucz się korzystać z funkcji tablicowych ('push, map, grep'). – dgw
Niezależnie od tego, jakich materiałów używasz do samodzielnego uczenia się w Perlu, zdecydowanie radzę je upuścić - twój kod jest oparty na szablonach, które są bardzo nieaktualne (globalnie nazwane uchwyty plików, otwarta forma 2-arg) do wręcz błędnych. Proszę nie brać tego osobiście - to oczywiście nie twoja wina, ale byłbyś bardzo BARDZO dobrze obsługiwany przez uczenie się z dużo lepszych i bardziej nowoczesnych książek/tutoriali/przykładów kodu, niż to, czego wyraźnie używasz. – DVK