Tôi là tương đối mới đối với Perl và tôi đã đi qua dự án này mà tôi đang có một chút thời gian khó khăn với. Đối tượng của dự án là so sánh hai tệp csv, một trong số đó sẽ chứa: $ name, $ model, $ version và khác chứa: $ name2, $ disk, $ storage vào cuối Tệp RESULT sẽ chứa các dòng phù hợp đó và gộp các thông tin như vậy: $ name, $ model, $ version, $ disk, $ storage.bỏ qua một dòng trong một mảng, Perl
Tôi đã cố gắng thực hiện việc này, nhưng vấn đề của tôi là khi một trong các yếu tố thiếu chương trình bị hỏng. Khi nó gặp một dòng trong tập tin thiếu một phần tử nó dừng lại ở dòng đó. Làm cách nào để khắc phục sự cố này? bất kỳ đề xuất hoặc một cách để làm thế nào tôi có thể làm cho nó bỏ qua dòng đó và tiếp tục?
Dưới đây là mã của tôi:
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;
Trong lần tiếp theo, hãy sử dụng nghiêm ngặt mã của bạn để bảo vệ bạn trước các lỗi gây phiền nhiễu. –
Vui lòng 'sử dụng nghiêm ngặt;', 'sử dụng cảnh báo;', thụt lề mã của bạn đúng cách, sử dụng phiên bản đối số mở bằng tập tin từ vựng và tìm hiểu cách sử dụng các hàm mảng ('push, map, grep'). – dgw
Bất cứ tài liệu nào bạn đang sử dụng để tự mình dạy Perl, tôi khuyên bạn nên bỏ chúng - mã của bạn dựa trên các mẫu chỉ đơn giản là lỗi thời (xử lý tập tin toàn cục, dạng mở 2-arg). Xin vui lòng không dùng cá nhân này - nó rõ ràng không phải là lỗi của bạn, nhưng bạn sẽ được RẤT VERY phục vụ tốt bằng cách học hỏi từ nhiều hơn và hiện đại hơn sách/hướng dẫn/mã ví dụ hơn những gì bạn đang sử dụng rõ ràng. – DVK