2009-12-24 3 views
1

это как моя таблица выглядит:Как получить список результатов, когда sqlite возвращает более одной строки?

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

, когда пользователь выбирает «1234» от водителя и все из машины вещи получить немного грязный. (Пользователь делает выбор из графического интерфейса)

когда я делаю:

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

это дает мне abc_machine xyz_machine.

Я попытался отделить их, используя split(/ /, $getConfig), но не работает.

спасибо.

Прошу прощения, если я задал этот вопрос не в том месте. Я попытался найти подходящее место, но не смог его найти.

+0

Что-то случилось с тем, как вы извлекаете строки - не должно быть необходимости их разбиения. –

+0

Чего вы хотите достичь? Просто опишите, что приемлемо в результате. – sastanin

+3

Почему вы используете оболочки execs вместо DBI? –

ответ

0

Там может быть скрытая вкладка или символ новой строки. Посмотрите на значение ascii пустого символа между строками и используйте его в вашем раздельном вызове.

2

Вместо вызова программы SQLite вы должны использовать DBI.

Кстати:

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

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

Итак, проверьте данные, содержащиеся в $getConfig.

+1

's/you can/you * действительно, действительно * should /' – Telemachus

+0

Обновленный ответ. Спасибо. –

0

На самом деле sqlite3 поддерживает два варианта командной строки, которые могут вам пригодиться: -list (разделитель - '|') и -csv для csv-файла. Подробнее см. Справочную страницу для sqlite3. Затем вы можете разделить на разделитель или использовать Text :: CSV_XS для разделения отдельных полей.

Следуя за комментарием Rashids ниже, я явно не понял ваш вопрос. Виноват. Вот один из способов сделать это:

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

Хорошо, сепаратор уже в стороне. – 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

Хороший ответ, но ненужное использование финиша(), поскольку драйвер автоматически вызывает его для вас, когда вы извлекаете последнюю строку из набора результатов. – converter42

+0

ой. спасибо за исправление, я не писал Perl довольно долгое время. –

+2

Вызов закончить - хорошая практика, даже если это не нужно в конкретном случае. Если вы всегда это называете, вы не забудете позвонить, когда вам это нужно. Если вы не всегда называете это, вы можете забыть позвонить ему, когда вам нужно. :) –

-1

ОК, ребята, я нашел его ...

\ W соответствует любому не «слово» символ

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

это отделяет его приятно в:

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

спасибо всем.

+6

Вы задали неправильный вопрос, поэтому вы фокусируетесь на неправильном ответе. Вы должны использовать DBI, чтобы программно получать ваши данные, * не * вызывая программу оболочки. – Ether

+1

@Другие: да. Да, тысячу раз. Я чувствую себя немного кричащим, когда приходит этот пост. Я собираюсь пойти медитировать сейчас, чтобы я не вытащил бобинс ... (цитирую: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self- содержащиеся метки/1732454 # 1732454) – Telemachus

+0

Не обманывайте себя этим \ W. Есть много символов, которые не находятся в \ W (как литерал.). Возможно, вы хотели бы разбить что-то вроде пробела. –