IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   разбить по тегам xml файл 5гб (http://www.imho.ws/showthread.php?t=136423)

FELARMANIA 15.11.2008 20:15

разбить по тегам xml файл 5гб
 
xml файл 5гб
самый простой способ не открывая его разбить по тегам на несколько мелких файлов 20-50mb
:confused:

thanks for advice!!

Bozo 15.11.2008 21:52

Самый простой скачать Mapforce xttp://www.altova.com/products/mapforce/data_mapping.html и перегнать в БД. Тебе же его все = в базу загонять?

FELARMANIA 15.11.2008 22:16

есть свой импортер
только в xml много мусора, вот хотелось бы чтото типа на php на серваке запустить простенькое разделить все в тегах
<data>text</data>
по файлам
и потом подредактировать все.
и затем в базу.

Hubbitus 16.11.2008 01:22

Цитата:

Сообщение от FELARMANIA (Сообщение 1607010)
самый простой способ не открывая его разбить по тегам на несколько мелких файлов 20-50mb

Не понял, как это "не открывая разбить"??? Не открывая даже на чтение, как можно прочитать оттуда данные?

Что значит разбить по тегам?? Вам нужно получить валидные куски меньшего размера? Структура документа это позволяет? Что за XML-то?
Ну и самое главное, зачем это все? Если речь действительно идет о загрузке его потом в БД, то наверное лучше и вправду его открыть, отмапить в память, читать постепенно и загружать в БД, вот и все.

Bozo 16.11.2008 14:26

Цитата:

Сообщение от Hubbitus (Сообщение 1607060)
Не понял, как это "не открывая разбить"???

Скорее всего он имел в виду не загружая в какой-нибудь редактор или VS или IE. Потому что IE такой объем не xml не отрисует, упадет. Да и из редакторов справятся только 2 или 3.

FELARMANIA 16.11.2008 17:30

ладно
мне тут на пхп накидали три строки.

а мапфорсе чтото серьёзное, пойду разбираться

FELARMANIA 22.11.2008 21:58

пока вот возился, подкинули идейку с перлом
благо у меня сервак готов,

Код:

#!C:/Server/Perl/bin/perl.exe
use strict;
use warnings;
no warnings 'uninitialized';

use XML::Rules;

die "Usage: $0 split_tag filename(s)\n" unless @ARGV >= 2;
my ($split_tag, @files) = @ARGV;

my $parser = XML::Rules->new(
        rules => [
                _default => 'raw',
                $split_tag => sub {
                        my ($file, $id) = ( $_[4]->{parameters}{'file'}, ++$_[4]->{parameters}{'id'});
                        $id = sprintf "%04d", $id;
                        $file =~ s/(?:\.xml)?$/-$id.xml/i;

                        if (ref $_[3]->[-1]{_content}) {
                                $_[3]->[-1]{_content}[-1] =~ s/^.*(\n[^\n]+)$/$1/s;
                        } else {
                                $_[3]->[-1]{_content} =~ s/^.*(\n[^\n]+)$/$1/s;
                        }

                        print " $file\n";
                        open my $FH, '>:utf8', $file or die qq{Can't create "$file": $^E\n};
                        print $FH $_[4]->parentsToXML();
                        print $FH $_[4]->ToXML( $_[0], $_[1]),"\n";
                        print $FH $_[4]->closeParentsToXML();
                        close $FH;

                        return;
                }
        ]
);


foreach my $file (@files) {
        $parser->parsefile( $file, {file => $file});
}

запускаем по шаблону
spliter.pl split_tag C:\filename.xml

заменяем split_tag на тег (просто слово) и данные в этом теге будут разрезаны на файлы, все будет закрыто, и без ошибок, и всего за пару секунд.

спасибо всем :)


Часовой пояс GMT +4, время: 12:14.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.