patch, diff, damnation...

7 отговора 182 прегледа
#1

patch, diff, damnation...

Гледайте каква задачка си съставих:

Имаме файл. Текстов.

Вземат го двама и нанасят промени (добавки) => 2 версии на файла.
ако направим diff между тях, ще можем с този diff да превръщаме единия файл в другия. Аз обаче искам да получа файл с всички добавки. Т.е. от diff-а да махна "минусите" и той да остане валиден diff, който да дам на patch.

ако още не ви е станало ясно, търся как да обединя историите на две LICQ-та. Ама съм беден откъм идеи. Мамка му!

there is no spoo^H^H^H^Hfork()
Отговор
в отговор на Яceн #2

Амииии ....

ако с един grep махнеш всички редове, които почват с -_интервал_ (или табулация)?

Понякога седя и си мисля, а понякога само си седя ...
Отговор
в отговор на Яceн #3

Re: patch, diff, damnation...

хвърляш ги в две таблици на Access и с две-три операции си готов.

Отговор
в отговор на Smile #4

И двамата не познахте -

Масклин: така се получават diff-ове на които patch после се цупи
smile: форматът е много идиотски и не се поддава на лесно конвертиране до спретнати редове от таблица (не и без писане на код)

абе ще се пише, то се е видяло.

и ще се логва в mysql, че да няма затруднения по-после :)

there is no spoo^H^H^H^Hfork()
Отговор
в отговор на Яceн #5

Re: patch, diff, damnation...

1. Какъв е точно формата? Можеш ли да постнеш 10-ина реда?
2. Имаш ли оригиналния файл, без нанесените промени от двамата?

Отговор
в отговор на Яceн #6

хайде бе!

Трака се за 10 мин.

като се има вида, в който се записва диалога на кю, а именно:


[ R | 0001 | 0260 | 0000 | 1085474874 ]
:ала-бала?
[ S | 0001 | 0270 | 0000 | 1085474889 ]
:тинтири-минтири :)
където с R е белязан реда, който си получил, а с S - който си изпратил.

Хедъра е еднакъв - последното е секунди от началото на съществуването на кюто, а отдолу (един или повече редове) е самия текст. Хвърля се в една таблица като се пишат десет реда код:


Set rst = New ADODB.Recordset
rst.Open "forma", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
Set rstok = New ADODB.Recordset
rstok.Open "forma_ok", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
rst.MoveFirst
Do While Not rst.EOF
xx = Left(rst!field1, 1)
If xx = "[" Then
head = rst!field1
Else
rstok.AddNew
rstok!head = head
rstok!body = rst!field1
rstok.Update
End If
rst.MoveNext
Loop
rst.Close
rstok.Close



където forma ти е файла всеки ред по отделно, а forma_ok ти е таблица с две клетки head(където се записва хедъра) и
body(защото можеш да имаш повече от един ред в едно съобщение).
Конвертираш двата файла на хисторито така, после с едно куери изтриваш еднаквите редове, правиш сорт по онова число за да получиш как
времево се е движил диалога и експортваш в подходящ формат.

точно 10 мин работа.

Редактирано от Smile на

Отговор
в отговор на l #7

Re: patch, diff, damnation...

ако няма оригиналния файл може да импровизира и да направи анти-дифф между двата...

Отговор
в отговор на Яceн #8

Много набързо (нетествано)

#!/usr/bin/perl
use strict;

our $fname1 = $ARGV[0];
our $fname2 = $ARGV[1];
our %dataHash;

processFile($ARGV[0]);
processFile($ARGV[1]);


our @kArr = sort (keys %dataHash);
for(my $i = 0; $i <= $#kArr; $i++){
print "[ $dataHash{$kArr[$i]}{f1} | $dataHash{$kArr[$i]}{f2} | $dataHash{$kArr[$i]}{f3} | $dataHash{$kArr[$i]}{f4} | $kArr[$i] ]\n";
print $dataHash{$kArr[$i]}{buf};
}

sub processFile{
my ($fname) = @_;

my $buf;
my $key;
open(IFILE, $fname);
while(<IFILE>){
chomp();
if(m/^\[ ([SR]) \| ([0-9]+) \| ([0-9]+) \| ([0-9]+) \| ([0-9]+) \]/){
$dataHash{$5}{f1} = $1;
$dataHash{$5}{f2} = $2;
$dataHash{$5}{f3} = $3;
$dataHash{$5}{f4} = $4;
$dataHash{$5}{buf} = $buf;
$buf = "";
} else {
$buf .= "$_\n";
}
}
close(IFILE);
}

Отговор