On Mon, 2004-01-26 at 12:47, Enric Balletbà i Serra wrote:
> Hola a tots, em sembla perfecte, seria ideal poder partir el fitxer en
> diversos trossos i assignar-lo a diferents persones, crec que algà havia
> dit que tenia un script o alguna cosa semblant per fer-ho, desprÃs crec
Us passo un programa que va fer en Xavier Conde Rueda per partir (i
ajuntar) fitxers po, molt bo!
Cal tenir el perl instalÂlat. No sà si hi ha una versià nova, Xavier?
El mateix programa incorpora ajuda si no li passeu parÃmetres.
> que faltaria falta que una o dues persones per revisar els diversos
> fitxers perquà quedi una cosa coherent, com ho veus Aleix? tu que ets el
> que Ãltimament està mÃs actiu te'n pot encarregar de coordinar-ho?
#!/usr/bin/perl -w
# Aixà Ãs programari lliure; podeu redistribuir-lo i/o\n"
# modificar-lo sota els termes de la LlicÃncia PÃblica General GNU tal i\n"
# com ha estat publicada per la Free Software Foundation; bà sota la\n"
# versià 2 de la LlicÃncia.
#
# Aquest programa es distribueix amb l'expectativa de que serà Ãtil
# perà SENSE CAP GARANTIA; ni tan sols la garantia implÃcita de
# COMERCIABILITAT o ADEQUACIÃ PER UN PROPÃSIT PARTICULAR. Vegeu la
# LlicÃncia PÃblica General GNU per obtenir-ne
# mÃs detalls.
#
# Copyright 2003 Free Software Foundation
# Xavier Conde Rueda (xaviconde a eresmas.com)
# Aquesta fitxer de seqÃÃncia agafa un fitxer PO (o una part feta amb aquest)
# fitxer de sequencia) i en fa N trossos, on cada tros tà aproximadament
# el mateix nombre de cadenes traduÃbles.
# A mÃs, permet agafar mÃltiples fitxers PO fragmentats i fer-ne un complet.
# Parsegem l'entrada:
# Quants parÃmetres d'entrada hi ha?
$numParam = scalar @ARGV;
# Quà vol fer l'usuari:
# 1. --parts: es separa un fitxer en parts
# 2. --fusio: es fusionen les parts d'un fitxer
# 3. No res: escriu l'ajuda
if ($numParam < 2)
{
&escriuAjuda ();
}
else
{
if ($ARGV[0] eq "--parts")
{
# L'usuari vol tallar un fitxer
$numParts = $ARGV[1];
if (2 <= (scalar $numParts))
{
if (($numParam >= 4) && ($ARGV[2] eq "--entrada"))
{
$nomFitxer = $ARGV[3];
print STDERR "Es tallara el fitxer $nomFitxer en $numParts parts\n";
&fesParts ($numParts, $nomFitxer);
if (($numParam == 5) &&
($ARGV[4] eq "--esborra"))
{
# No ho esborrarà ben bÃ, perÃ
unlink $nomFitxer;
print STDERR "S'ha esborrat el fitxer $nomFitxer\n";
}
print STDERR "Fet\n";
}
else
{
print STDERR "Heu d'especificar un fitxer d'entrada amb --entrada\n";
}
}
else
{
print STDERR "Nomes es poden fer 2 o mes parts\n";
}
}
elsif ($ARGV[0] eq "--fusio")
{
# Hem d'esborrar els fitxers d'entrada?
if ($ARGV[$numParam - 1] eq "--esborra")
{
pop (@ARGV);
$numParam = scalar @ARGV;
$esborra = 1;
}
else
{
$esborra = 0;
}
# L'usuari vol fusionar N parts en un fitxer
if ($ARGV[$numParam - 2] eq "--sortida")
{
# S'especifica un fitxer de sortida
$sortida = pop (@ARGV);
# Traiem els elements que no siguin fitxers
pop (@ARGV);
shift (@ARGV);
# Llista de fitxers que es fusionaran
@fitxersParts = @ARGV;
if (scalar @fitxersParts > 1)
{
print STDERR "Es fusionaran ", scalar @fitxersParts, " fitxers\n";
&fusionaParts ($sortida, @fitxersParts);
if ($esborra)
{
print STDERR "S'esborraran els fitxers @fitxersParts\n";
unlink (@fitxersParts);
}
print STDERR "Fet\n";
}
else
{
print STDERR "S'han d'especificar mes d'un fitxer d'entrada\n";
}
}
else
{
print STDERR "No s'ha especificat cap fitxer amb --sortida\n";
}
}
else
{
&escriuAjuda ();
}
}
# fesParts (numParts, nomFitxer)
sub fesParts
{
my $numParts = $_[0];
my $nomFitxer = $_[1];
my $numCadenesTotals;
if (!open ENTRADA, "<$nomFitxer")
{
print STDERR "No s'ha pogut obrir el fitxer $nomFitxer\n";
exit 0;
}
# Donat que els fitxers PO no son massa grans, es factible
# construir una llista i tenir-la en memÃria per treballar-hi
my @entrada = <ENTRADA>;
close ENTRADA;
# Hem de comptar quants missatges hi ha al fitxer d'entrada
foreach $linia (@entrada)
{
if ($linia=~/^(\s)*msgid(\s)+/)
{
$numCadenesTotals ++;
}
}
# Tallem els missatges en $numCadenes com a mÃxim
my $numCadenes;
if (($numCadenesTotals % $numParts) == 0)
{
$numCadenes = $numCadenesTotals / $numParts;
}
else
{
$numCadenes = ($numCadenesTotals / $numParts) + 1;
}
if ($numCadenes < $numParts)
{
print STDERR "No hi han suficients missatges per fer $numParts parts\n";
exit 0;
}
# Per a cada part...
for (; $numParts != 0; $numParts--)
{
# Creem un nou fitxer...
my $nomFitxerPart = $nomFitxer.".".$numParts;
my $textFitxer = "";
# Recorrem el fitxer del final al principi
# Trobem $numCadenes vegades (o les que quedin)...
for ($i = $numCadenes;
($numCadenesTotals > 0) && ($i > 0) && (scalar @entrada > 0);
$i --,
$numCadenesTotals--)
{
# ...una cadena traduible
for ($trobada = 0; !$trobada;)
{
$linia = pop (@entrada);
$textFitxer = $linia.$textFitxer;
if ($linia=~/^(\s)*msgid(\s)+/)
{
$trobada = 1;
}
}
}
# Quan trobem la darrera cadena traduible, no agafem
# els comentaris que pugui tenir (en les altres sÃ)
# Ho fem ara:
for ($trobada = 0;
!$trobada &&
(scalar @entrada) >0; )
{
$linia = $entrada[(scalar @entrada) - 1];
if ($linia=~/^(\s)*#/)
{
$textFitxer = (pop (@entrada)).$textFitxer;
}
else
{
$trobada = 1;
}
}
# Ja podem escriure el fitxer de sortida
if (!open PART, ">$nomFitxerPart")
{
print STDERR "No s'ha pogut obrir el fitxer $nomFitxerPart\n";
exit 0;
}
print PART "$textFitxer";
close PART;
print STDERR "S'ha escrit el fitxer $nomFitxerPart\n";
}
}
# fusionaParts ($sortida, @fitxersParts)
sub fusionaParts()
{
my $sortida = $_[0];
my $fitxersParts = \$_[1];
my $primer = 0;
my @fitxerSortida;
# Per a cada fitxer d'entrada...
foreach $nomFitxer (@fitxersParts)
{
if (!open ENTRADA, "<$nomFitxer")
{
print STDERR "No s'ha pogut obrir el fitxer $nomFitxer\n";
exit 0;
}
my @fitxer = <ENTRADA>;
close ENTRADA;
# Hem de saber quin Ãs el primer fitxer pq contà la capÃalera
# No importa que els altres no estiguin ordenats
for ($i = 0; $i < (scalar @fitxer - 2) && !$primer; $i ++)
{
$linia = $fitxer[$i];
if ($linia=~/^(\s)*msgid(\s)+""/)
{
# Tenim un candidat a ser capÃalera
$linia = $fitxer[$i + 1];
if ($linia=~/^(\s)*msgstr(\s)+""/)
{
$primer = 1;
# Com ha de ser el primer, canviem l'ordre
# de les dues llistes perque el push ho faci bÃ
@aux = @fitxerSortida;
@fitxerSortida = @fitxer;
@fitxer = @aux;
}
}
}
# Actualitzem la llista de sortida
push (@fitxerSortida, @fitxer);
}
if (!open SORTIDA, ">$sortida")
{
print STDERR "No s'ha pogut obrir el fitxer $sortida\n";
exit 0;
}
# Escrivim la llista en la sortida
foreach $linia (@fitxerSortida)
{
print SORTIDA $linia;
}
close SORTIDA;
}
# escriuAjuda ()
sub escriuAjuda
{
print STDERR "Un fitxer de sequencia per tallar un fitxer PO en N parts\n";
print STDERR "en que cada part te aproximadament el mateix nombre de traduccions.\n";
print STDERR "\n";
print STDERR "Us: retalla opcio\n";
print STDERR "opcio es una d'aquestes dues:\n";
print STDERR "--parts numParts --entrada nomFitxer\tSepara el fitxer d'entrada en numParts parts\n";
print STDERR "\t\t\t\tS'afegira l'extensio .1, .2, ..., .numParts\n";
print STDERR "\t\t\t\tCompte: es sobreescriuran els fitxers generats\n";
print STDERR "--fusio fitxers --sortida nomFitxer\tCrea un unic fitxer dels fitxers d'entrada\n";
print STDERR "\t\t\t\tNo cal que els fitxers estiguin ordenats\n";
print STDERR "\t\t\t\tCompte: es sobreescriura el fitxer de sortida\n";
print STDERR "\n";
print STDERR "El modificador per a --parts es:\n";
print STDERR "--entrada nomFitxer\t\tEspecifica un fitxer PO d'entrada.\n";
print STDERR "\t\t\t\tNo es pot fer servir l'entrada estandard.\n";
print STDERR "El modificador per a --fusio es:\n";
print STDERR "--sortida nomFitxer\t\tEscriu la sortida en el fitxer nomFitxer.\n";
print STDERR "\t\t\t\tSi s'especifica \"-\", s'escriura el fitxer per la sortida estandard.\n";
print STDERR "\n";
print STDERR "Un modificador final comu a tots dos es:\n";
print STDERR "--esborra\t\t\tOpcional. S'esborrara el fitxer PO d'entrada.\n";
print STDERR "\t\t\t\tUtil per no tenir duplicats entre parts i subparts.\n";
print STDERR "\t\t\t\tNo es recomenable esborrar el PO orginal.\n";
}