Aplicar split en array con ciertas condiciones
Publicado: 2015-10-24 03:58 @207
Hola.
Tengo una entrada con el siguiente formato:
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:
b) una carpeta llamada "5993" que contenga un archivo llamado "5993" cuyo contenido sea:
Y así, sucesivamente.
Pues bien, yo llego hasta aquí:
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...
Tengo una entrada con el siguiente formato:
Using text Syntax Highlighting
texto
texto
...
(ID 3467)
texto
texto
...
(ID 3467)
texto
texto
...
(ID 5993)
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
b) una carpeta llamada "5993" que contenga un archivo llamado "5993" cuyo contenido sea:
Using text Syntax Highlighting
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.005 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...