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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнения больших файлов, сравнение строк в файлах 
:(
    Опции темы
Gazprom
Дата 10.4.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток.
Есть такая задачка.
Требуется сравнить строки в двух файлах. На выходе должны быть созданы 2 файла, в первом будут строки которые не содержаться во втором и наоборот.
Данную задача решена мною была
Код

#!/usr/bin/perl -w

open my $input1, "< in1.txt" or die "Ошибка открытия: $!";
open my $output1, "> out1.txt" or die "Ошибка открытия: $!";
open my $input2, "< in2.txt" or die "Ошибка открытия: $!";
while (my $line = <$input1>) {    
    $temp=0;
    while (my $line1 = <$input2>) {
        if ($line eq $line1) { 
            $temp=1;
            @temp_array=(@temp_array,$line);
            last;
        }
    }    
    if ($temp==0) { 
        print $output1 $line; 
    }
 }
close $input2 or die "Ошибка закрытия: $!";
close $output1 or die "Ошибка закрытия: $!";
close $input1 or die "Ошибка закрытия: $!";
open my $output2, "> out2.txt" or die "Ошибка открытия: $!";
open my $input2, "< in2.txt" or die "Ошибка открытия: $!";
 while (my $line2= <$input2>) {
    $temp1=0;    
    foreach $val (@temp_array) {        
        if ($val eq $line2) {
            $temp1=1;
            last;
        }        
    }
    if ($temp1==0) { 
        print $output2 $line2; 
    }
}
close $input2 or die "Ошибка закрытия: $!";
close $output2 or die "Ошибка закрытия: $!";
 

Но вот есть ще два условия которые меня загоняют в тупик((
1)размер исходных файлов неизвестен. Возможно, что они будут настолько большие, что их нельзя будет загрузить в память, построить по ним в памяти хэш или дерево и т.д.
2) известно, что строки в обоих входных файла отсортированы в одинаковом лексографическом порядке

Подскажи какую нить идею для решения...

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


Опытный
**


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

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



Если памяти не хватает. Тогда грузите файлы небольшими кусочками. 
PM MAIL   Вверх
Gazprom
Дата 13.4.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Данная задача больше является теоретической, чем практической=(

Цитата

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

Как примерно это делается? И мож ноли будет брать определенные куски файла, например все которые начинаются на определенный символ? (в файле строки отсортированы)    
PM MAIL   Вверх
amg
Дата 13.4.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А зачем кусками файлы зачитывать? Можно каждый раз по одной строке. 
Зачтываем по строке из каждого файла, сравниваем их оператором cmp, в зависимости от результата сравнения 
0: пропускаем эти строки (они одинаковые)
1: читаем следующую строку из первого файла (или из второго, см. справку по cmp)
-1: читаем следующую строку из второго файла

Как то так, реализовать, вроде, несложно.
PM MAIL   Вверх
Gazprom
Дата 13.4.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(amg @ 13.4.2009,  10:05)
Зачтываем по строке из каждого файла, сравниваем их оператором cmp, в зависимости от результата сравнения 
0: пропускаем эти строки (они одинаковые)
1: читаем следующую строку из первого файла (или из второго, см. справку по cmp)
-1: читаем следующую строку из второго файла

Как то так, реализовать, вроде, несложно.

Так и сделал, вроде получилось.
Вот хотелось бы чтоб прокомментировать, если есть какие нить недоработки, хотя ои скорей всего есть!!1
Заранее спасибо
Код

open my $input1, "< in1.txt" or die "Ошибка открытия: $!";
open my $input2, "< in2.txt" or die "Ошибка открытия: $!";
open my $output1, "> out1.txt" or die "Ошибка открытия: $!";
open my $output2, "> out2.txt" or die "Ошибка открытия: $!";

my $line=<$input1>; my $line1=<$input2>;
$str_temp="";
$str_temp1="";
$bul=0;
while ($bul==0) {    
    if ($str_temp eq $line) {
        $line=<$input1>;
        next;
    }
    if ($str_temp1 eq $line1) {
        $line1=<$input2>;
        next;
    }    
    $temp=$line cmp $line1 ;
    if ($temp==0) { 
        $str_temp=$line;
        $str_temp1=$line1;
        $line=<$input1>;
        $line1=<$input2>;
    }
    if ($temp==-1) {
        print $output1 $line; 
        $str_temp=$line;
        $line=<$input1>;
    }
    if ($temp==1) {
        print $output2 $line1;
        $str_temp1=$line1;
        $line1=<$input2>;
    }
    unless ($line) {
        while ($line1) {
            if ($str_temp1 eq $line1) {
                $line1=<$input2>;
                next;
            }    
            print $output2 $line1;
            $str_temp1=$line1;
            $line1=<$input2>;
        }
        last;    
    }
    unless ($line1) {
        while ($line) {
            if ($str_temp eq $line) {
                $line=<$input1>;
                next;
            }    
            print $output1 $line;
            $str_temp=$line;
            $line=<$input1>;
        }
        last;    
    }
    
}
close $output2 or die "Ошибка закрытия: $!";
close $output1 or die "Ошибка закрытия: $!";
close $input2 or die "Ошибка закрытия: $!";
close $input1 or die "Ошибка закрытия: $!";

PM MAIL   Вверх
sir_nuf_nuf
Дата 13.4.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тут есть тонкость:

Что значит "нет во втором файле" ? Нет вообще ?
Тогда в любом случае вам для того что бы определить что строки нет в файле нужно его полностью просмотреть, а он в память не поместится..

В Случае если файлы отсортированы, так что строки в порядке возрастания - то решение предложил товарищ amg

Таким образом для вас задача сводится к сортировке очень большого файла.
Это называется внешняя сортировка и описана хорошо в книжке Дональда Кнута


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amg
Дата 14.4.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Gazprom, перед безусловным зачитыванием строки из файла необходимо делать проверку на конец файла 
if (eof($input1)) {...}
и не пытаться зачитывать очередную строку, если файл уже кончился.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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