Могу ли я взять текст, который находится в CSV и сделать его именем файла CSV - proUbuntu
Купить гитару в Москве
0 голосов
/

Я действительно надеюсь, что смогу объяснить мою проблему. Ваша помощь будет высоко ценится.

У меня более 1000 CSV-файлов, которые выглядят точно так же. Пример

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,,,,,,,,

Проблема в том, что я хочу, чтобы именем файла csv была дата выполнения полета, которая находится в строке 2. В этом примере это дата 06/06/16. Поэтому я хочу, чтобы имя файла CSV было 20160606. Обратите внимание на изменение в порядке, которое, вероятно, делает его немного более запутанным.

Как я могу сделать это автоматически?

Ответы [ 3 ]

0 голосов
/

Этот скрипт имеет два аргумента. Один для каталога для ваших CSV-файлов. Другое для новых файлов исправлено.

Если у вас есть несколько рейсов в один и тот же день, я добавил время в качестве части имени файла, чтобы обеспечить уникальное имя для каждого файла.

Сценарий:

#!/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

Сводка скрипта

Переменные и команды скрипта:

  • indir: скрипт, использующий переменные indir для каталога ваших файлов CSV.
  • oudir: создайте этот каталог для новых копируемых файлов.
  • Первая строка: проверяет, существует ли каталог out перед продолжением сценария.
  • arr: переменная массива для разделения даты и создания нового имени файла.
  • sed: текстовый редактор командной строки, используемый для удаления ненужных строк.
0 голосов
/

Возможно, это заставит Младенца Иисуса (или, по крайней мере, Ларри Уолла) плакать, но:

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.

Примечание:

  1. предполагается, что дата находится в последнем столбце первой строки каждого файла
  2. предполагается, что исходный формат даты "%d/%m/%y", но приведенный вами пример можно прочитать как "%m/%d/%y" - вам необходимо проверить и отрегулировать, если необходимо

Он должен пропускать файлы, из которых он не может проанализировать действительную дату в ожидаемом месте: обработка ошибок для анализа даты взята из Обработка исключений в Perl: как справляться с фатальными ошибками во внешних модулях .

Удалите -n , только если / когда вы уверены, что он поступает правильно.

0 голосов
/

Вы можете использовать cut для выбора нужного столбца, затем вы можете использовать date (, например, , в сочетании с sed), чтобы задать имя файла.

Поместите это в цикл, чтобы просмотреть все ваши файлы, и все готово.

Чтобы помочь вам в пути:

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

Это выберет дату, теперь ваша очередь преобразовать ее.

Добро пожаловать на сайт proUbuntu, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...