Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование формата даты из DBF 
V
    Опции темы
tapio
Дата 28.1.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



Всем привет! У меня такая проблема.  Есть dbf файл (Rst_0.dbf), я к нему обращаюсь напрямую из перла, дата в этом файле в формате 7.11.2008, при выполние вот этого кода:

use DBD::Xbase;
my $xbase_dbh = DBI->connect("DBI:XBase:.", undef, undef, {RaiseError =>1});
my $sel = "select RESULTDATE from Rst_0.dbf";
my $sel_csr = $xbase_dbh->prepare($sel);
$sel_csr->execute();
while (my ($dt) = $sel_csr->fetchrow_array()) {
    print " $dt\n";
    print "<br>";
}

 дата выдается как 200811, т.е. выдается год и месяц, а день отсекается. Предполагаю, что нужно здесь использовать преобразование формата как для MySQL:
my $sel = "select DATE_FORMAT(RESULTDATE,'%d.%m.%y %H:%i') from Rst_0.dbf"; 
но не прокатывает! Может кто нибудь сможет помочь? 
PM MAIL   Вверх
amg
Дата 28.1.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(tapio @  28.1.2009,  11:09 Найти цитируемый пост)
while (my ($dt) = $sel_csr->fetchrow_array()) {
дата выдается как 200811, т.е. выдается год и месяц, а день отсекается.
Может, недостающая информация в следующих элементах массива?

PM MAIL   Вверх
tapio
Дата 28.1.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



Поигрался с датой, пришел к такому выводу: Если в dbf файле дата до 10 числа, т.е. 01.11.2008 .......09.11.2008, то в результате выполнения данного скрипта выводится дата как 200811. А если дата в файле 10.11.2008 или 11.11.2008 и т.д. то выводится корректно: 20081110. Следственно баг в самом модуле XBase, либо у меня руки кривые smile  Какие мысли будут уважаемые? Можно ли обойти эту проблему? 
PM MAIL   Вверх
shamber
Дата 28.1.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



tapio, у вас база не очень большая? может выложите, а я у себя бы проверил. просто под рукой нет dbf баз
PM MAIL Jabber   Вверх
tapio
Дата 28.1.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



shamber
файл на 5 мегабайт.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Rst_1.zip 101,94 Kb
PM MAIL   Вверх
shamber
Дата 28.1.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



посмотрите в структуре создается запись
   0TKGRP INCOMING OFFICE TRAFFIC           200811 701:30:00
тогда как для 
  0TKGRP INCOMING OFFICE TRAFFIC           2008111007:30:00  
вместо нуля пустое место. 
Из-за этого проблемы
PM MAIL Jabber   Вверх
tapio
Дата 28.1.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



Спасибо! Начинает ситуация прояснятся. А вы как просматриваете этот dbf файл? 
Просто я в Access его открываю, там дата отражается как 07.11.2008.
PM MAIL   Вверх
shamber
Дата 28.1.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



tapio, а я человек простой  smile я блокнот использую(AkelPad) smile
пробовал тупо заменить регуляркой $_ =~ s/(\d{6})\s(\d)/$1$num$2/g; где $num =0

но файл на 1 байт получается больше, не могу понять почему

PM MAIL Jabber   Вверх
tapio
Дата 28.1.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



Моя мысль копия твоей, тоже пытаюсь регуляркой заменить, но пока безрезультатно :( 
PM MAIL   Вверх
tapio
Дата 28.1.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



shamber
Цитата

но файл на 1 байт получается больше, не могу понять почему

 Так в файл 0 добавляем, вот и получается. Или я гоню?
PM MAIL   Вверх
shamber
Дата 28.1.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(tapio @  28.1.2009,  17:33 Найти цитируемый пост)
Или я гоню?

Гонишь. потому что заменяется пробел на 0

200811 9 -> 200081109

PM MAIL Jabber   Вверх
shamber
Дата 28.1.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Все разобрался
Я забыл что файл не текстовый, а бинарный smile
Я ваш файл обработал этим скриптом, а после этого у меня совершенно спокойно появилось число 20081107 smile
Код

use strict;

open(File,'<'.'rst_1.dbf');
open(TEMP,'>'."file.dbf");

binmode File;# то что я забыл в первый раз
binmode TEMP; # добавить :)

my $num ='0';
while(<File>){
$_ =~ s/(\d{6})\s(\d)/$1$num$2/g;
print TEMP $_;
}
close File;
close TEMP;



Это сообщение отредактировал(а) shamber - 28.1.2009, 22:13
PM MAIL Jabber   Вверх
tapio
Дата 29.1.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2007

Репутация: нет
Всего: нет



shamber
Спасибо тебе огромное! Очень помог мне! 
Я решил без временного файла делать, а перезаписывать этот.
Код

 open(FILE,'+<'."$local_file");
        binmode FILE;
        my $num = 0;
        my $out = '';
        while(<FILE>){
            $_ =~ s/(\d{6})\s(\d)/$1$num$2/g;
            $out .= $_;
        }
        truncate(FILE, 0);
        seek(FILE, 0, 0);
        print FILE $out;
        close FILE;


PM MAIL   Вверх
shamber
Дата 29.1.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Всегда пожалуйста smile

ЗЫ отмечайте вопрос как решенный smile

Это сообщение отредактировал(а) shamber - 29.1.2009, 21:47
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.