patch, diff, damnation...
7 отговора
182 прегледа
patch, diff, damnation...
Гледайте каква задачка си съставих:
Имаме файл. Текстов.
Вземат го двама и нанасят промени (добавки) => 2 версии на файла.
ако направим diff между тях, ще можем с този diff да превръщаме единия файл в другия. Аз обаче искам да получа файл с всички добавки. Т.е. от diff-а да махна "минусите" и той да остане валиден diff, който да дам на patch.
ако още не ви е станало ясно, търся как да обединя историите на две LICQ-та. Ама съм беден откъм идеи. Мамка му!
there is no spoo^H^H^H^Hfork()
Имаме файл. Текстов.
Вземат го двама и нанасят промени (добавки) => 2 версии на файла.
ако направим diff между тях, ще можем с този diff да превръщаме единия файл в другия. Аз обаче искам да получа файл с всички добавки. Т.е. от diff-а да махна "минусите" и той да остане валиден diff, който да дам на patch.
ако още не ви е станало ясно, търся как да обединя историите на две LICQ-та. Ама съм беден откъм идеи. Мамка му!
there is no spoo^H^H^H^Hfork()
Амииии ....
ако с един grep махнеш всички редове, които почват с -_интервал_ (или табулация)?
Понякога седя и си мисля, а понякога само си седя ...
Понякога седя и си мисля, а понякога само си седя ...
Re: patch, diff, damnation...
хвърляш ги в две таблици на Access и с две-три операции си готов.
И двамата не познахте -
Масклин: така се получават diff-ове на които patch после се цупи
smile: форматът е много идиотски и не се поддава на лесно конвертиране до спретнати редове от таблица (не и без писане на код)
абе ще се пише, то се е видяло.
и ще се логва в mysql, че да няма затруднения по-после :)
there is no spoo^H^H^H^Hfork()
smile: форматът е много идиотски и не се поддава на лесно конвертиране до спретнати редове от таблица (не и без писане на код)
абе ще се пише, то се е видяло.
и ще се логва в mysql, че да няма затруднения по-после :)
there is no spoo^H^H^H^Hfork()
Re: patch, diff, damnation...
1. Какъв е точно формата? Можеш ли да постнеш 10-ина реда?
2. Имаш ли оригиналния файл, без нанесените промени от двамата?
2. Имаш ли оригиналния файл, без нанесените промени от двамата?
хайде бе!
Трака се за 10 мин.
като се има вида, в който се записва диалога на кю, а именно:
[ R | 0001 | 0260 | 0000 | 1085474874 ]
:ала-бала?
[ S | 0001 | 0270 | 0000 | 1085474889 ]
:тинтири-минтири :)
където с R е белязан реда, който си получил, а с S - който си изпратил.
Хедъра е еднакъв - последното е секунди от началото на съществуването на кюто, а отдолу (един или повече редове) е самия текст. Хвърля се в една таблица като се пишат десет реда код:
където forma ти е файла всеки ред по отделно, а forma_ok ти е таблица с две клетки head(където се записва хедъра) и
body(защото можеш да имаш повече от един ред в едно съобщение).
Конвертираш двата файла на хисторито така, после с едно куери изтриваш еднаквите редове, правиш сорт по онова число за да получиш как
времево се е движил диалога и експортваш в подходящ формат.
точно 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 на
Re: patch, diff, damnation...
ако няма оригиналния файл може да импровизира и да направи анти-дифф между двата...
Много набързо (нетествано)
#!/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);
}
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);
}