Dividir en separador de columnas en windows

06/24/2012  09:58 AM                 0 Backup of deleted Report 20120622.xlk
08/20/2012  06:51 PM            28,160 deleted 9 2 Foundation Installs on March 7th.xls
08/20/2012  06:51 PM            31,232 deleted-Installations March 10.xls
08/20/2012  06:51 PM            37,821 deleted Support Process 1.0.pdf
08/20/2012  06:51 PM            57,344 deleted_Support_Process_3_18_2010 V2.vsd

Hey! Chico. Estoy escribiendo una utilidad de Perl para algunos análisis del sistema de archivos. Estoy usando DIR en Windows para enumerar ciertos archivos. Quiero obtener la fecha de acceso (la primera columna) y el nombre del archivo (la última columna). Muchos nombres de archivos tienen espacio, por lo que no puedo dividirlos fácilmente en espacios en blanco. Idealmente, debería dividirme en el separador de columnas.

  • ¿Alguien sabe qué carácter debo derramar para la salida de Windows (XP) como esta para obtener cada columna por separado?
  • O si no hay un buen personaje para dividir, ¿hay una estrategia centrada en Perl para obtener las dos columnas que necesito?

preguntado el 29 de agosto de 12 a las 16:08

¿No es el Perl stat función de trabajo en Windows, combinado con opendir, readdir, closedir. Analizar la salida del comando DIR es similar a analizar la salida de ls en Unix: propenso a errores. Si continúa con DIR, divida por números de columna (caracteres): 1-10 es la fecha y el nombre comienza en alguna otra posición hasta el final de la cadena. -

2 Respuestas

La split La función tiene un tercer argumento opcional para definir el número máximo de cadenas en las que se divide:

my ($date, $time, $ampm, $size, $name) = split /\s+/, $input, 5;

Analizando la salida de dir no es sensato. Puede abrir un directorio en Perl con el opendir función y bucle sobre las entradas:

open my $directory, $dirname or die;
while(defined(my $file = readdir $directory)) {
   next if -d "$dirname/$file"; # skip directories
   my $mtime = (stat "$dirname/$file")[9]; # we use the mtime (last modified)
   printf "%10d %s", $mtime, $string;
}

Puede consultar la documentación para conocer más opciones del stat función que incluye los índices de matriz para el tiempo de acceso o el tamaño del archivo. Los tiempos se dan como tiempo Unix (segundos desde el 1 de enero de 1970 a las 00:00) pero se pueden convertir con localtime a un formato más legible.

Respondido 29 ago 12, 17:08

Si lo hace use File::stat;, puedes usar stat("$dirname/$file")->mtime en lugar de (stat("$dirname/$file"))[9] - Ikegami

Las funciones compatibles con Perl son mucho más fáciles, gracias por el consejo. - gbtimmon

Existe una solución Perl pura. los stat La función se puede utilizar para obtener el tiempo de acceso.

De lo contrario, podría dividir en espacios en blanco:

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
    my ( $date, undef, undef, undef, $name ) = split " ", $_, 5;
    print "$date: $name\n";
}

__DATA__
06/24/2012  09:58 AM                 0 Backup of deleted Report 20120622.xlk
08/20/2012  06:51 PM            28,160 deleted 9 2 Foundation Installs on March 7th.xls
08/20/2012  06:51 PM            31,232 deleted-Installations March 10.xls
08/20/2012  06:51 PM            37,821 deleted Support Process 1.0.pdf
08/20/2012  06:51 PM            57,344 deleted_Support_Process_3_18_2010 V2.vsd

Podrías usar unpack para consumir datos columna.

while (<DATA>) {
    chomp;
    my ( $date, $filename ) = unpack 'A10 x29 A*';
    print "$date: $filename\n";
}

Respondido 29 ago 12, 17:08

Eso dividiría los nombres de los archivos, lo que podría dificultar las cosas, realmente debería poder derramar en la columna de alguna manera. - gbtimmon

Puede evitar la unión (potencialmente rota), solo use my ($date, $time, $m, $size, $filename) = split " ", $_, 5; - Hobbs

Además, tiene razón en que debería poder usar readdir y stat en lugar de desembolsar a dir. Si no lo escribe como una respuesta completa, lo haré :) - Hobbs

+2 para stat sugerencia para este problema - turba

/ / no es equivalente a " ", y quieres lo último. No es necesario volver a unirse si impone un límite en la cantidad de campos. Estás dejando una nueva línea final en $name. Solucioné esos problemas y eliminé los vars no utilizados. - Ikegami

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.