преобразование TXT в XLS

Discussion in 'PHP' started by warlock000, 27 Jul 2011.

  1. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Привет всем ещё раз, собственно сам сабж: есть база такого плана:

    Code:
    Морской, ул. Красноармейская, 30 кв.м, среднее состояние, развитая инфраструктура района, 3.250.000 руб. Тел. 8-000-100-10-10.  
    Морской, ул. Красноармейская, 5/5, 32 кв.м, перепланирована, встроенная кухня, отличный ремонт, 3.100.000 руб. 8-90-000-0-000, Сергей. 
    Нужен скрипт или программа которая способна выполнить экспорт и распределение текста по колонкам примерно для такого вида колонки (Exel колонки):

    Code:
    Район	
    Улица	
    Этаж	
    Этажность	
    Площадь	
    Жилая(s)	
    Кухня(s)	
    Цена
    Владелец	
    Контакт	
    Добавлен	
    Источник	
    
    К примеру текст из файла должен заполнится в колонки, к примеру имеем текст вида:

    Заречный, ул. Гастелло, 1/5, 27 кв.м, коммуникации центральные, мебель, бытовая техника, состояние среднее, хороший район, рядом остановка, 2.900.000 руб. Возможна скидка. Тел. 8-998-999-89-89.
    Code:
    Заречный идёт в колонку Район	
    ул. Гастеллоя в колонку Улица
    1/5 в колонки Этаж и Этажность
    27 кв.м в колонку Площадь	
    2.900.000 руб. в колонку Цена
    Тел. 8-998-999-89-89 в колонку Контакт
    7я колонка это весь текст (Заречный, ул. Гастелло, 1/5, 27 кв.м, коммуникации центральные, мебель, бытовая техника, состояние среднее, хороший район, рядом остановка, 2.900.000 руб. Возможна скидка. Тел. 8-998-999-89-89.)
    
    Тоесть $a обрабатывается текст с начала строки до первой запятой и переносится в 1ю колонку
    $b обрабатывает текст после "ул." и переносится весь тоже до первой запятой
    $c ищет текст формата число/число и переносит оба числа в разные колонки (пример выше)
    $d ищет текст (цифры с плавающей запятой) до кв.м и переносит их в колонку
    $e Добавляет сумму до руб. и переносит их в колонку с ценой
    $f обрабатывает цифры после Тел. и переносит их в соответствующую колонку
    $g копирует весь текст в 7ю колонку (весь текст объявления без изменений)

    Очень желательно что бы скрипт был на Perle (знаю что есть функция ParseExce) ну или уж на крайней случай если есть софтинка подобного рода для такого преобразования текста, если кому не лень выложите примерчик для обработки работающий ибо я не силёт в перле, да и вообще в языках программирования, буду просто безумно благодарен вам, заранее большое спасибо! :)
     
    #1 warlock000, 27 Jul 2011
    Last edited: 27 Jul 2011
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    warlock000 Нужно? Пишите.

    В экселе есть импорт из csv.
     
    _________________________
    1 person likes this.
  3. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    warlock000 сделайте импорт из txt файла с разделителем ", " Далее возьмите столбец который нужно еще разделить, киньте в текстовик и еще раз импортируйте с нужным разделителем или наоборот объедините разделы которые нужно. Немного ручной работы и всё готово. Скрипты писать - это оплачиваемые услуги, тем более такие, как вы запрашивайте. Gifts +1
     
  4. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Ручками не выйдет, так как база большая точек и , много
     
  5. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    http://bit.ly/qrk6UD
     
  6. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Code:
    #!/usr/bin/perl6
    
    grammar Объявление
    {
      rule TOP
      {
        :i ^
        [
        | <район>
        | ул. <улица>
        | <этаж> '/' <этажей>
        | <площадь>
        | <цена>
        | <-[,]>+
        ] ** ','
        .+? 'тел.'? <контакт>
      }
    
      token район
      {
        :i
        [
        | Заречный
        | Морской
        | Центральный
        ] # и т. д.
      }
      
      token улица   { <-[,]>+ }
      token этаж    { \d+ }
      token этажей  { \d+ }
      token площадь { :i \d+ <.ws>? 'кв.' <.ws>? 'м'   }
      token цена    { :i [\d+] ** '.'     <.ws>? 'руб' }
      token контакт { [\d+] ** '-' }
    }
    
    .say for Объявление.parse(
      'Заречный, ул. Гастелло, 1/5, 27 кв.м, коммуникации центральные,
       мебель, бытовая техника, состояние среднее, хороший район,
       рядом остановка, 2.900.000 руб. Возможна скидка. Тел. 8-998-999-89-89.
      '.trim).pairs;
    Perl - хороший язык :)
    Code:
    sh$ perl6 -v
    This is Rakudo Perl 6, version 2011.01 built on parrot 3.0.0
    
     
    1 person likes this.
  7. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Огромное спасибо за скрипт, ты очень выручил

    Нарыл скриптик для экспорта в эксель:
    Code:
    use strict; 
    use Cwd;
    use Win32::OLE;
     
    my $out_dir = cwd().'/';
    $out_dir =~ s/\//\\/g;
    my ($xls_file, $mim_file, $out_file, $line, $cell_no, $value);
    my ($workbook, $woksheet, $ex);
    my $help = "ЗАПУСК: txt2xls <файл-шаблон XLS> <файл данных> <результ.XLS>\n\n".
            "Файл отчета должен иметь структуру:\n".
            "  A1=значение\n".
            "где A1-ячейка, 'значение' - значение этой ячейки.\n".
    		"Пример exel.pl test.xls test.txt result.xls.\n";
    my %cells = ();
    ($xls_file, $mim_file, $out_file) = @ARGV;
    if (!(-f $xls_file) || !(-f $mim_file)) {
      print "ОШИБКА: Файл(ы) не найдены\n";  print $help;  exit 0;
    }
    open(IN,$mim_file) || die $!;
    while(<IN>) {
      if($_ !~ /^[\#|\;]/) {
        chomp;
        ($cell_no, $value) = split(/=/,$_);
        $cell_no =~ s/\s//g;
        $value =~ s/^\s//g;
        $cells{$cell_no} = $value;
      }
    }
    close IN;
    # Открываем Excel (выдрано из доки к Win32::OLE)
    eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')};
    die "Excel not installed" if $@;
    unless (defined $ex) {
     $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
           or die "Oops, cannot start Excel";
    }
    $workbook = $ex->Workbooks->Open($out_dir.$xls_file);
    my $worksheet   = $workbook->Worksheets(1);
    foreach $cell_no (sort keys %cells) {
      $worksheet->Range($cell_no)->{Value} = $cells{$cell_no};
    }
    $workbook->SaveAs($out_dir.$out_file);
    undef $workbook;
    $ex->Quit;
    undef $ex; 
    Запуск: имя_шаблона_xls имя_файла_данных имя результир.файла_xls (exel.pl exel.xls data.txt out.xls)
    data.txt должен иметь формат примерно такой:

    Code:
    C3=Заречный
    D3=ул. Гастелло
    E3=1
    F3=5
    G3=27
    H3=
    I3=
    J3=2.900.000
    K3=Собственник
    L3=8-998-999-89-89.
    M3=28.07.2011
    N3=Объявление
    O3= Заречный, ул. Гастелло, 1/5, 27 кв.м, коммуникации центральные, мебель, бытовая техника, состояние среднее, хороший район,  рядом остановка, 2.900.000 руб. Возможна скидка. Тел. 8-998-999-89-89.
    P.S. Данные выгружаются в текстовый файл следующим образом:

    Code:
    rajon	Morskoy ylica	Gastello etaj	1 etajey	5 plowad	27 kv.m price	2.900.000 rub kontact	8-998-999-89-89 rajon	Centralniy ylica	Gastello etaj	1 etajey	5 plowad	27 kv.m price	2.900.000 rub kontact	8-998-999-89-89 rajon	Zare4 ylica	Gastello etaj	1 etajey	5 plowad	27 kv.m price	2.900.000 rub kontact	8-998-999-89-89
    Если выгружать в exel :
    (А1-А21) (B1-B21)
    Code:
    rajon	Morskoy
    ylica	Gastello
    etaj	1
    etajey	5
    plowad	27 kv.m
    price	2.900.000 rub
    kontact	8-998-999-89-89
    rajon	Centralniy
    ylica	Gastello
    etaj	1
    etajey	5
    plowad	27 kv.m
    price	2.900.000 rub
    kontact	8-998-999-89-89
    rajon	Zare4
    ylica	Gastello
    etaj	1
    etajey	5
    plowad	27 kv.m
    price	2.900.000 rub
    kontact	8-998-999-89-89
    Можно ли сделать так что бы выходные данные приобрели вид:

    Code:
    C3=Заречный
    D3=ул. Гастелло
    E3=1
    F3=5
    G3=27
    H3=
    I3=
    J3=2.900.000
    K3=Собственник
    L3=8-998-999-89-89.
    M3=28.07.2011
    N3=Объявление
    O3= Заречный, ул. Гастелло, 1/5, 27 кв.м, коммуникации центральные, мебель, бытовая техника, состояние среднее, хороший район,  рядом остановка, 2.900.000 руб. Возможна скидка. Тел. 8-998-999-89-89.
    Или сразу добавлялись в заданные колонки?
     
    #7 warlock000, 28 Jul 2011
    Last edited: 28 Jul 2011
  8. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Сабж решил сам, выучил регулярки в перл и написал скрипт обработчик

    З.Ы. Хочу выразить большую благодарность dpe_x и astrologer за помощь

    З.З.Ы. УВ можераторы, тему можно закрывать
     
Loading...