2010-06-15 2 views
1

Je suis à la recherche d'un script Perl pour imprimer des modèles de voiture et des couleurs, et les données sont ci-dessous. Je veux savoir s'il y a de toute façon à faire en sorte que le modèle de voiture se dirige vers un champ afin que je puisse l'imprimer quand je le veux? les données ci-dessous sont un fichier csv. la façon dont je veux que les données à rechercher un rapport est ci-dessous etPerl script pour imprimer le modèle de voiture et la couleur de la voiture

******** Voici comment les données ******** semble

Chevy 
blue,1978,Washington 
brown,1989,Dallas 
black,2001,Queens 
white,2003,Manhattan 

Toyota 
red,2003,Bronx 
green,2004,Queens 
brown,2002,Brooklyn 
black,1999,Harlem 

** ********* Voilà comment je suis en train d'obtenir les données à rechercher dans un rapport ***********

Model Car: Toyota

Couleur: Rouge Année: 2002 Ville: Queens

+4

Quel code avez-vous jusqu'à présent? – Ether

+2

Les noms comme "Toyota" et "Chevy" sont des marques de voiture *, pas des modèles. Les modèles sont des choses comme "Camry" ou "Tahoe". –

+1

Alors voulez-vous que la ligne make soit répétée pour chaque ligne de données ou voulez-vous la ligne make une fois pour chaque ensemble de lignes de données? La première option semble être ce que vous obtenez de la récolte actuelle de réponses, mais je soupçonne que ce que vous voulez vraiment, c'est la deuxième option. Malheureusement, votre exemple de sortie montre une seule ligne de données, il est donc difficile de dire ce qui est prévu. –

Répondre

1
open IN, "< somefile"; 
while (<IN>) { 
    chomp; 
    if (m/,/) { 
    @temp = split /,/, $_; 
    printf "Car model: %s\nColor: %s\nYear: %s\nCity: %s\n\n", $make, @temp; 
    } else { 
    $make = $_; 
    } 
} 
+2

Cela ne fonctionnerait pas sous strict, que tout le code devrait utiliser. En outre, 3-arg ouvert est recommandé. –

0

je passer par la ligne de fichiers en ligne et pour chaque ligne (pseudo-code, non testé):

if ($line ~= /\w+,\d+,\w+/) { # matches the lines with the information 
    my $array = split $line at , 
    print to file array[0] + "," + array[1] + "," + array[2] + "\n" 
} elsif ($line ~= /\w+/) { # matches the car model since the information was already matched 
    print "Car Model:" + $line + "\n" 
} else { # must be the whitespace so you know the information about the car is done 
    print "\n" # to separate the car information 
} 

Si vous ne disposez pas de la ligne vide dans votre fichier csv puis effectuez les newline pour séparer les modèles de voiture ailleurs

4
open my $fh, '<', 'filename' or die $!; 

while (<$fh>) { 
    next if /^\s*$/; 
    my @fields = split /,/, $_; 
    print("Car Model: $fields[0]\n"), next if @fields == 1; 

    my %data; 
    @data{qw(color year city)} = @fields; 
    print "Color:$data{color} Year:$data{year} City:$data{city}\n"; 
} 
+0

Woah, en utilisant un tableau comme la clé d'un hachage ...? – Brian

+0

@Brian: Ceci est appelé tranche de hachage. http://www.perlcircus.org/hashes.shtml –

+0

Je voudrais imprimer sur make (désolé vous avez raison) et ensuite énumérer toutes les voitures sous cette marque et ne pas le répéter pour chaque voiture. exemple chevy voiture info info voiture info info voiture info info voiture info info Ford voiture info info voiture info info voiture info info voiture info info Toyota voiture info info info voiture info info voiture info voiture Merci pour votre aide –

1

Vous pouvez lire les fichiers CSV avec Text::CSV. Ce module captera tous les cas de bords que vous risquez de manquer dans votre propre implémentation.

Consultez perldoc perldsc et perldoc perldata pour obtenir de l'aide sur les structures de données perl.

Questions connexes