2011-05-06 9 views
6

Tengo un programa heredado y, después de ejecutarlo, generará un archivo de registro. Ahora necesito analizar este archivo de registro.¿Cómo se usa perl para procesar un archivo cuyo formato es similar a unicode?

Pero el formato de archivo es muy extraño. Por favor, consulte lo siguiente, utilicé vi para abrirlo, parece un archivo Unicode, pero no se inició FFFE. después de usar el bloc de notas, ábralo, guárdelo y ábralo de nuevo; descubrí que el FFFE se agrega con el bloc de notas. Entonces puedo usar el comando 'type log.txt> log1.txt' para convertir el archivo completo a formato ANSI. Más tarde en Perl, puedo usar/TDD/en Perl para buscar lo que necesito.

Pero ahora, yo no puede hacer frente a este formato de archivo.

Cualquier comentario o idea será muy apreciada.

0000000: 5400 4400 4400 3e00 2000 4c00 6f00 6100 T.D.D.>. .L.o.a. 

Después libreta guardarlo

0000000: fffe 5400 4400 4400 3e00 2000 4c00 6f00 ..T.D.D.>. .L.o. 

open STDIN, "< log.txt"; 
while(<>) 
{ 
    if (/TDD/) 
    { 
    # Add my logic. 
    } 
} 

he leído el hilo que es muy útil, pero aún no puede resolver mi problema How can I open a Unicode file with Perl?

No puedo agregar respuesta, entonces edito mi hilo.

Gracias Michael, He intentado su secuencia de comandos pero he recibido el siguiente error. Revisé mi versión de Perl es 5.1, el sistema operativo es Windows 2008.

* ascii 
* ascii-ctrl 
* iso-8859-1 
* null 
* utf-8-strict 
* utf8 
UTF-16:Unrecognised BOM 5400 at test.pl line 12. 

actualización

probé el UTF-16LE con el comando:

perl.exe open.pl utf-16le utf-16 <my log file>.txt 

pero yo todavía tengo el error como

UTF-16LE:Partial character at open.pl line 18, <$fh> line 1824. 

también, probé utf-16be, obtuve lo mismo e rror

Si usara UTF-16, me consiguió el error

UTF-16:Unrecognised BOM 5400 at open.pl line 18. 

línea open.pl 18

is "print while <$fh>;" 

Alguna idea?

Actualizado: 11/05/2011. Gracias a todos por su ayuda. Resolví el problema. Encontré que los datos en el archivo de registro no son UTF-16 después de todo. Entonces, tuve que escribir un proyecto .net por Visual Studio. Leerá el archivo de registro con UTF-16 y escribirá en un nuevo archivo con UTF-8. Y luego usé script perl para analizar el archivo y generar datos de resultados. Funcionó ahora.

Entonces, si alguno de ustedes sabe cómo usar perl, lean un archivo con muchos datos basura, por favor díganme, muchas gracias.

p. Ej.basura muestra de datos

tests.cpp:34) 
਍吀䐀䐀㸀 䰀漀愀搀椀渀最 挀挀洀挀漀爀攀⸀搀氀 

lector de uso hexagonal para abrirlo:

0000070: a88d e590 80e4 9080 e490 80e3 b880 e280 ................ 
0000080: 80e4 b080 e6bc 80e6 8480 e690 80e6 a480 ................ 
0000090: e6b8 80e6 9c80 e280 80e6 8c80 e68c 80e6 ................ 
00000a0: b480 e68c 80e6 bc80 e788 80e6 9480 e2b8 ................ 
+0

Puede ser de alguna ayuda: http://www.perlmonks.org/?node_id=615796 –

+0

¿Ha intentado especificar diferentes codificaciones para la lectura de flujo? –

+0

La respuesta aceptada de la pregunta a la que se vinculó le dice exactamente lo que necesita hacer para leer su archivo codificado UCS-2LE. Lo probé y funcionó para mí. - Sea más específico por qué razón "no puede resolver". – daxim

Respuesta

6

El archivo parece estar codificado en UTF-16LE. Los bloques de notas que se agregan se llaman "Marca de orden de bytes" o solo BOM.

Así es como se puede leer el archivo usando Perl:

use strict; 
use warnings; 
use Encode; 
# list loaded encodings 
print STDERR map "* $_\n", Encode->encodings; 
# read arguments 
my $enc = shift || 'utf16'; 
die "no files :-(\n" unless @ARGV; 
# process files 
for (@ARGV) { 
    open my $fh, "<:encoding($enc)", $_ or die "open $_: $!"; 
    print <$fh>; 
    close $fh; 
} 
# loaded more encodings now 
print STDERR map "* $_\n", Encode->encodings; 

Proceder como este, teniendo cuidado de suministrar la codificación correcta para el archivo:

perl open.pl utf16 open.utf16be.txt 
perl open.pl utf16 open.utf16le.txt 
perl open.pl utf16le open.utf16le.nobom.txt 

Aquí está la versión revisada siguiendo las sugerencias de tchrist :

use strict; 
use warnings; 
use Encode; 

# read arguments 
my $enc_in = shift || die 'pass file encoding as first parameter'; 
my $enc_out = shift || die 'pass STDOUT encoding as second parameter'; 
print STDERR "going to read files as encoded in: $enc_in\n"; 
print STDERR "going to write to standard output in: $enc_out\n"; 
die "no files :-(\n" unless @ARGV; 

binmode STDOUT, ":encoding($enc_out)"; # latin1, cp1252, utf8, UTF-8 

print STDERR map "* $_\n", Encode->encodings; # list loaded encodings 

for (@ARGV) { # process files 
    open my $fh, "<:encoding($enc_in)", $_ or die "open $_: $!"; 
    print while <$fh>; 
    close $fh; 
} 

print STDERR map "* $_\n", Encode->encodings; # more encodings now 
+0

Gracias Michael. Lo intenté pero obtuve el error como 'UTF-16: BOM 5400 no reconocida en la línea 12 de test.pl. la línea en 'print <$fh>;' – Orionpax

+1

@Orionpax, en Perl, la codificación 'utf16' espera una lista de materiales, porque podría ser grande o pequeña endian. Intenta usar 'UTF-16LE' en su lugar. – cjm

+0

Luego lo ejecutó en el archivo sin lista de materiales. Voy a actualizar mi ejemplo. – Lumi

Cuestiones relacionadas