Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > из mysql в csv


Автор: Suic2 17.7.2012, 15:10
Простая программа, делает запрос к mysql и выводит в csv файл
Код

#!/usr/bin/perl

use Text::CSV_XS;
use DBI;
use Time::Local;

my $d_s = 'DBI:mysql:база:localhost';
my $dbh = DBI->connect($d_s, "пользователь", "пароль") or die "Can't connect to $d_s: $DBI::errstr";
my $sth = $dbh->prepare(qq{SELECT users.id, users.ip, users.fio FROM users});
$sth->execute();
$name=timelocal(localtime()).$$;
open $fh, ">>", "/tmp/$name.csv" or die "$name.csv: $!";
my $csv = Text::CSV_XS->new ({binary=>1,eol=>"\n",sep_char=>";"});
while($s=$sth->fetchrow_arrayref())
{
    $csv->print ($fh, $s);
}
close $fh;
$sth->finish();
$dbh->disconnect;

получается такой файл
Код

id;ip;"ФИО"
id;ip;"ФИО"
.............
id;ip;"ФИО"


проблемма заключается в том, что когда в базе не указан ip, то получается так:
Код

id;ip;"ФИО"
id;"ФИО"

а хотелось бы так:
Код

id;ip;"ФИО"
id;;"ФИО" или id;"";"ФИО"

что исправить?

Автор: vadiml 17.7.2012, 15:44
А зачем для этого использовать perl?

mysql и сам умеет делать csv файлы, и Вашей ошибки там не будет.

$mysql -h хост -u юзер -pпароль база -e 'запрос' > ответ.csv

Разделители можно задать стандартными для mysq средствами.

Автор: Suic2 17.7.2012, 15:54
 smile 
вопрос был не в выборе средства. по моему, конкретный вопрос требует конкретного ответа
естественно есть много способов вывода в файл из бд, но я не просто так выбрал perl от нечего делать

Автор: sir_nuf_nuf 17.7.2012, 15:54
Цитата(vadiml @  17.7.2012,  15:44 Найти цитируемый пост)
А зачем для этого использовать perl?

Для добра же!

Автор: Pfailed 17.7.2012, 17:16
Насколько помню так происходит когда переменная = undef.
Замените undef на пустые строки. Ну и параметр always_quote в конструкторе $csv, возможно, нужно установить.
Код

...
$csv->print ($fh, [map { $_ // '' } @$s]);
...

Автор: Suic2 18.7.2012, 12:02
Спасибо, работает smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)