Sono relativamente nuovo a Perl e ho trovato questo progetto con cui mi sto divertendo un po '. L'oggetto del progetto è di confrontare due file CSV, uno dei quali conterrà: $ nome, $ modello, $ versione e l'altro che conterrà: $ nome2, $ disco, $ archiviazione alla fine il Il file RESULT conterrà le righe corrispondenti e metterà insieme le informazioni in questo modo: $ nome, $ modello, $ versione, $ disco, $ archiviazione.saltando una linea in un array, Perl
Sono riuscito a farlo, ma il mio problema è che quando uno degli elementi mancanti nel programma si interrompe. Quando incontra una linea nel file che manca un elemento si ferma su quella linea. Come posso risolvere questo problema? qualche suggerimento o un modo su come posso forse saltare quella linea e continuare?
Ecco il mio codice:
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;
Nella prossima volta si prega di utilizzare rigorosamente il codice, che ti protegge da fastidiosi bug. –
Si prega di usare 'strict strict;', 'use warnings;', indietreggia il proprio codice, usa la versione dell'argomento di open con i filehandle lessicali e impara come usare le funzioni di array ('push, map, grep'). – dgw
Indipendentemente dai materiali che utilizzi per insegnarti in Perl, ti consiglio caldamente di lasciarli cadere - il tuo codice è basato su modelli che vanno dal semplice obsoleto (maniglie di file con nome globale, forma a 2-arg di apertura) a decisamente sbagliato. Si prega di non prenderlo personalmente - ovviamente non è colpa tua, ma saresti MOLTO MOLTO servito imparando da libri/esercitazioni/esempi di codice molto migliori e più moderni di quello che stai chiaramente usando. – DVK