Posso pegar o texto que está em um csv e torná-lo o nome do arquivo csv

0

Eu realmente espero poder explicar meu problema. Sua ajuda será muito apreciada.

Eu tenho mais de 1000 arquivos csv que parecem exatamente o mesmo. Exemplo

Malian Aero Company,,,,,Aircraft,TZ-DDG,(Seed 1),,,Block-on (Z),18:19,      Landing (Z),,18:14,Date,06/06/16
2016  MALI  WEATHER  MODIFICATION  PROGRAM,,,,,,,,,,Block-off (Z),16:35,        Takeoff (Z),,16:41,Page,1
,Pilot:,Daniel Chacon,,Co-Pilot:,Malik,,Observer: ,,,Total Time,01:44,    Flight  Time    ,,01:33,Type,Seed
,,,,,,,,,,,,,,,,
Time,Cell,Event,LAT,LON,Alt.,Ejectable (Glacio),,BIP (Hygro),,Remarks,,,,,,
(UTC),No.,No.,(VOR),(DME),(Kft),0,Recycle,Burn,Recycle,,,,,,,
17:03,1,,12.55,-9.03,"8,000",,,1,,,,,,,,
17:06,,,12.67,-9.13,"8,000",,,1,,Updraft 500/900 ft/m,,,,,,
17:11,,,12.56,-9.11,"8,000",,,1,,,,,,,,
17:13,,,12.74,-9.07,"8,000",,,1,,,,,,,,
17:35,2,,13.31,-9.07,"9,000",,,1,,,,,,,,
17:39,,,13.53,-9.05,"9,000",,,1,,,,,,,,

O problema é que quero que o nome do arquivo csv seja a data em que o voo ocorreu, o que está na linha 2. Neste exemplo, a data é 06/06/16 . Portanto, quero que o nome do arquivo csv seja 20160606 . Observe a alteração na ordem, o que provavelmente a torna um pouco mais confusa.

Como posso fazer isso automaticamente?

    
por terdon 22.06.2017 / 14:00

3 respostas

0

Este script tem dois argumentos. Um para o diretório de seus arquivos csv. O outro para os novos arquivos corrigidos.

Caso você tenha mais de um voo no mesmo dia, adicionei o tempo como parte do nome do arquivo para garantir que haja um nome exclusivo para cada arquivo de saída.

O script:

#!/bin/bash

indir=$HOME/indir
outdir=$HOME/outdir

[[ -d $outdir ]] || (echo "Outdir doesn't exist... Exiting..." ; exit) 

process() {
    file=$1
    datetime=$(head -1 $file|awk -F, '{print $NF"/"$(NF-2)}' | sed s#/#:#g)

    IFS=':' read -r -a arr <<< "$datetime"
    newname=$(printf "20${arr[2]}${arr[0]}${arr[1]}-${arr[3]}${arr[4]}.csv\n")
    echo "Name Change: $file -> $newname"
    sed -e '1,7d' < $file > $outdir/$newname
}

for i in "$indir"/*.csv; do
    process "$i"
done

Resumo do script

Variáveis e comandos do script:

  • indir: O script usando as variáveis indir para o diretório de seus arquivos csv.
  • oudir: crie este diretório para os novos arquivos a serem copiados.
  • Primeira linha: verifica se o diretório out existe antes de continuar o script.
  • arr: Uma variável de matriz para dividir a data e criar o novo nome de arquivo.
  • sed: Um editor de texto de linha de comando usado para excluir as linhas indesejadas.
por L. D. James 22.06.2017 / 15:13
0

Provavelmente vai fazer o bebê Jesus (ou pelo menos, Larry Wall) chorar, mas:

prename -n '
  use Text::CSV;
  use Time::Piece;
  open my $fh, "<", $_ or die "$_ : $!";
  eval {
    my $r = Text::CSV->new()->getline($fh);
    s{.*(?=\.csv)}{Time::Piece->strptime($r->[-1], "%d/%m/%y")->strftime("%Y%m%d")}e  if ($r);
    1;
  } 
  or do {
    print "$_ skipped (no valid date field found)\n"
  }
' *.csv
file1.csv renamed as 20160606.csv
file2.csv renamed as 20160623.csv
file3.csv skipped (no valid date field found)
file.csv : Permission denied at (eval 8) line 4.

NOTA:

  1. assume que a data está na última coluna da primeira linha de cada arquivo
  2. assume que o formato de data original é "%d/%m/%y" , mas o exemplo que você deu pode ser lido como "%m/%d/%y" - você precisará verificar e ajustar, se necessário

Ele deve ignorar arquivos dos quais não consegue analisar uma data válida no local esperado: o tratamento de erros para a análise de data é obtido de Manipulação de exceções em Perl: Como lidar com erros fatais em módulos externos .

Remova o -n somente se / quando você estiver convencido de que está fazendo a coisa certa.

    
por steeldriver 22.06.2017 / 21:19
-4

Você pode usar cut para selecionar a coluna exata de que precisa e, em seguida, usar date ( por exemplo , em combinação com o sed) para definir o nome do arquivo.

Coloque isso em um loop para analisar todos os seus arquivos e pronto.

Para ajudar você no caminho:

cut --delim="," -f17 yourfile.csv | head -n1

Isso selecionará a data, agora é a sua vez de transformá-la.

    
por don.joey 22.06.2017 / 15:01