Script Bash para editar arquivos do Excel

2

Eu tenho vários arquivos Excel neste formato.
Eles são relógio e data e hora do relógio.

---------------------------------
| Name     | Time               |
---------------------------------
| Person A | 03-Jul-17 8:15 AM  |
| Person A | 03-Jul-17 10:32 AM |
| Person A | 03-Jul-17 1:56 PM  |
| Person A | 03-Jul-17 6:15 PM  |
| Person A | 04-Jul-17 8:29 AM  |
| Person A | 04-Jul-17 8:58 AM  |
| Person A | 04-Jul-17 9:43 AM  |
| Person A | 04-Jul-17 1:03 PM  |
| Person A | 04-Jul-17 2:17 PM  |
| Person A | 04-Jul-17 5:58 PM  |
.
.
.
| Person A | 31-Jul-17 7:45 AM  |
| Person A | 31-Jul-17 8:10 AM  |
| Person A | 31-Jul-17 3:26 PM  |
| Person A | 31-Jul-17 7:29 PM  |
---------------------------------

Eu gostaria de extrair esses dados e salvá-los como um novo arquivo do Excel neste formato:

---------------------------------------------
| Name     | Date      | Time In | Time Out |
---------------------------------------------
| Person A | 03-Jul-17 | 8:15 AM | 6:15PM   |
| Person A | 04-Jul-17 | 8:29 AM | 5:58PM   |
.
.
.
| Person A | 31-Jul-17 | 7:45 AM | 7:29PM   |
---------------------------------------------

Basicamente, é organizar os dados uma entrada por data com o primeiro horário para essa data como Time In e a data mais recente dessa data como Time Out .

Existem vários arquivos do Excel nesse formato, e fazer isso manualmente vai demorar muito.

Se você quiser convertê-los em .csv first edit, então converta-os de volta para .xlsx , é legal.

PS: Recompensa de 200 pontos em disputa.

    
por Parto 01.08.2017 / 09:36

2 respostas

1

Eu converti os arquivos para csv e usei um script PHP para analisar o conteúdo, criando o que eu queria. O resultado foi salvo em um novo arquivo, em seguida, esses arquivos foram convertidos novamente em xls e depois mesclados em um bloco de anotações.

A parte de conversão e mesclagem foi feita manualmente. Não é a melhor solução, mas está funcionando por enquanto.

Aqui está o script:

// get list of files from data directory
$files = array_diff(scandir('./data'), array('.', '..'));
foreach($files as $file):

    // get all data from the csv file and save in the $data array
    $csvFile = file('data/'.$file);
    $data = $list = [];
    foreach($csvFile as $line) {
        $data[] = str_getcsv($line);
    }
    unset($data[0]);

    // parse the data array and get the different sections: name. date and time
    foreach($data as $v) {
        $date = strtotime($v[1]);
        $list[date('d-m-Y',$date)][] = array(
            'name'=>$v[0],
            'date'=>date('d/m/Y',$date),
            'in'=>$date
        );
    }

    // create a new array and save parsed data in it with header columns
    $new = array(array('Name','Date','Time In','Time Out'));
    foreach($list as $k => $v) {
        $out = max(array_column($v, 'in'));
        $name = $v[0]['name'];
        $new[] = array(
            'name'=>ucwords(strtolower($name)),
            'date'=>$v[0]['date'],
            'in'=>date('h:i A', $v[0]['in']),
            'out'=>date('h:i A', $out)
        );
    }

    // The name of a new file in the new directory using this file name
    $filename = str_replace('.csv', '', basename($file));
    $fn = strtolower($filename.'-log.csv');

    // open the file and output the new array as CSV
    $out = fopen('new/'.$fn, 'w');
    foreach($new as $l) {
        fputcsv($out, $l, ",",'"');
    }
    fclose($out);

endforeach;
    
por Parto 01.08.2017 / 16:13
2

Existem 2 scripts de que você precisa. O único a converter de XLS para CSV é um comando xls2csv e o outro um script do github: csv2xls (outro csv2xls ). Há também csv2xlsx (e outro csv2xlsx ).

Entre as duas conversões, você pode editar os arquivos usando sua ferramenta favorita.

Se você quiser fazer isso sozinho: arquivos xlsx (e o mesmo se aplica ODT (open / libeoffice) são arquivos zipados e contém um XML com os dados. Você pode descompactar então e os dados estão em um XML. Manipulando o XML é um pouco mais difícil do que um CSV claro, mas quando a manipulação é automatizada, torna-se bastante eficiente.

    
por Rinzwind 01.08.2017 / 09:43