Hola.
Tengo una entrada con el siguiente formato:
Using text Syntax Highlighting
texto
texto
...
(ID 3467)
texto
texto
...
(ID 3467)
texto
texto
...
(ID 5993)
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Es decir: Tengo un conjunto variable de líneas de texto cuya última línea es un código entre paréntesis, y después otro conjunto variable de líneas de texto cuya última línea es un código -y aquí viene mi complicación-
que puede ser o no el mismo código que el anterior, y así sucesivamente...
Necesito un
script que lea ese archivo y cree tantas carpetas como códigos diferentes existan (el nombre de cada carpeta será el propio código), y que dentro de cada carpeta cree un archivo (el nombre del archivo será también el propio código) en cuyo contenido se imprima la parte de texto de la entrada que corresponda a ese código.
Por ejemplo, siguiendo con el ejemplo anterior, debería obtener lo siguiente:
a) una carpeta llamada "3467" que contenga un archivo llamado "3467" cuyo contenido sea:
Using text Syntax Highlighting
texto
texto
...
ID 3467
texto
texto
...
ID 3467
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
b) una carpeta llamada "5993" que contenga un archivo llamado "5993" cuyo contenido sea:
Using text Syntax Highlighting
texto
texto
...
ID 5993
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y así, sucesivamente.
Pues bien, yo llego hasta aquí:
Using perl Syntax Highlighting
$filename = shift;
open F, $filename or die;
undef $/;
$file = <F>;
close F;
@s = split /\(ID .*?\K\n/, $file; # divido la entrada en partes siempre que encuentre la secuencia ID + cualquier cosa + cambio de línea
foreach $s (@s) {
if ( $s =~ m/\ID (.*?)\)/ ) { # capturo el código en una variable
$code = $1;
}
mkdir "$code"; # creo carpeta con el código
# creo archivo con el código
open FILE, '>', "$code/$code\.txt" || die "can't open file output/$code";
print FILE "$s";
close FILE;
}
Coloreado en 0.006 segundos, usando
GeSHi 1.0.8.4
Como veis, solo sé dividir la entrada en partes siendo cada parte un conjunto del tipo "texto, texto, text, ID código". Pero lo que quisiera, y no sé cómo, es que mi
array tuviese en cuenta que si el código es igual al anterior no aplique la función split(), para dividir así el texto en las partes que realmente necesito.
No sé si me he explicado muy bien...