2009-12-24 6 views
1

voici comment ma table ressemble:Comment puis-je obtenir une liste de résultats lorsque sqlite renvoie plus d'une ligne?

key | driver | machine  | result 
----------------------------------- 
1 | 1234 | abc_machine | pass 
2 | 1234 | xyz_machine | fail 

lorsqu'un utilisateur sélectionne « 1234 » du conducteur et tout des choses de la machine deviennent un peu en désordre. (Utilisateur effectue la sélection d'une IUG)

quand je fais:

$getConfig = `sqlite3 abc.db "SELECT machine FROM $table_name WHERE driver='$drvrSel'"`; 

il me donne abc_machine xyz_machine.

J'ai essayé de les séparer en utilisant split(/ /, $getConfig), mais cela ne fonctionne pas.

Merci.

Je suis désolé si j'ai posé cette question à un mauvais endroit. J'ai essayé de trouver le bon endroit mais je n'ai pas pu le trouver.

+0

Quelque chose ne va pas avec la façon dont vous récupérez les lignes - il ne devrait pas être nécessaire de les diviser. –

+0

Que voulez-vous accomplir? Décrivez simplement ce qui est acceptable en conséquence. – sastanin

+3

Pourquoi utilisez-vous shell execs au lieu de DBI? –

Répondre

0

Il peut y avoir un onglet masqué ou un caractère de retour à la ligne. Regardez la valeur ASCII du caractère vide entre les chaînes et utilisez-la dans votre appel fractionné.

2

Au lieu d'appeler le programme SQLite, vous devez utiliser DBI.

Soit dit en passant:

perl -MData::Dumper -e '$_="abc_machine xyz_machine";print Dumper split//;' 

$ VAR1 = 'abc_machine';
$ VAR2 = 'xyz_machine';

Donc, vérifiez les données contenues dans $getConfig à nouveau.

+1

's/vous pouvez/vous * vraiment, vraiment * devrait /' – Telemachus

+0

Réponse mise à jour. Je vous remercie. –

0

En fait, sqlite3 supporte deux options de ligne de commande qui pourraient vous être utiles: -list (le séparateur est '|') et -csv pour le fichier csv. Voir la page de manuel de sqlite3 pour plus de détails. Vous pouvez ensuite diviser sur le séparateur ou utiliser Text :: CSV_XS pour séparer les champs individuels

Après le commentaire Rashids ci-dessous, j'ai clairement mal compris votre question. Mon erreur. Voici une façon de le faire:

my $result = `sqlite3 dbname "query"`; 
$result =~ s/\n/ /gs; 
+0

bien le séparateur est déjà à l'écart. – infinitloop

5
#!/usr/bin/perl 

use DBI; 
use strict; 

my $dbargs = {AutoCommit => 0, PrintError => 1}; 

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db","","",$dbargs); 
my $sth = $dbh->prepare("SELECT machine FROM test WHERE driver = 1234"); 
$sth->execute(); 

my @data; 

while (@data = $sth->fetchrow_array()) { 
    print $data[0] . "\n"; 
} 

$sth->finish; 
$dbh->disconnect; 
+0

Bonne réponse, mais inutile d'utiliser finish() car le pilote l'appelle automatiquement lorsque vous récupérez la dernière ligne du jeu de résultats. – converter42

+0

oh. merci pour la correction, je n'ai pas écrit Perl depuis pas mal de temps. –

+2

La fin de l'appel est une bonne pratique, même si elle n'est pas nécessaire dans un cas particulier. Si vous l'appelez toujours, vous n'oublierez pas de l'appeler quand vous en aurez besoin. Si vous ne l'appelez pas toujours, vous pourriez oublier de l'appeler quand vous en avez besoin. :) –

-1

Ok les gars je l'ai trouvé ...

\ W correspond à un caractère non « mot »

`@setConfig = split(/\W/, $getConfig);` 

ce sépare bien dans:

setConfig $ [0] = abc_machine $ setConfig [1] = xyz_machine

merci à tous.

+6

Vous avez posé la mauvaise question, vous vous concentrez donc sur la mauvaise réponse. Vous devriez utiliser DBI pour obtenir vos données par programme, * sans * appeler un programme shell. – Ether

+1

@Ether: oui. Mille fois, oui. Je me sens un peu comme crier quand ce genre de message arrive. Je vais aller méditer maintenant, afin que je ne tire pas un bobince ... (citer: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self- (tags-contained/1732454 # 1732454) – Telemachus

+0

Ne vous laissez pas berner par ce \ W. Il y a beaucoup de caractères qui ne sont pas dans \ W (comme un littéral.). Peut-être que vous vouliez séparer quelque chose comme un espace blanc à la place. –