Могу ли я взять текст, который находится в csv, и сделать его именем файла csv

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

У меня более 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. Обратите внимание на изменение порядка, которое, вероятно, делает его более запутанным.

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

0
задан 22 June 2017 в 15:55

9 ответов

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

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

Сценарий:

#!/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: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.
0
ответ дан 22 May 2018 в 21:16
  • 1
    Объяснение сценария было бы приятным. – Melebius 22 June 2017 в 16:29
  • 2
    @Melebius Я пытался использовать понятные переменные. Первоначально переменная массива была названа array , я сократился до arr, чтобы избежать горизонтальной прокрутки для просмотра всего скрипта. Первая строка проверяет выходной каталог перед продолжением. Второй раздел создает новое имя с даты. Команда sed удаляет первые 7 строк (линии - до 7). – L. D. James 22 June 2017 в 16:46
  • 3
    Я лично могу прочитать ваш скрипт, но OP, вероятно, нет. Например, они не упомянули о каких-либо проверенных командах, я думаю, они не могли прочитать ваш код с помощью конвейеров, подстановки команд, sed, awk и т. Д. И последнее, но не менее важное: объяснение должно быть частью ответа, а не комментария. – Melebius 22 June 2017 в 16:53

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

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

Сценарий:

#!/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: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.
0
ответ дан 18 July 2018 в 11:14

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

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

Сценарий:

#!/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: Создайте этот каталог для новых файлов, которые нужно скопировать. Первая строка: проверяет наличие существующего каталога перед продолжением сценария. arr: переменная массива для разделения даты и создания нового имени файла. sed: текстовый редактор командной строки, используемый для удаления нежелательных строк.
0
ответ дан 24 July 2018 в 19:45

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

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.

ПРИМЕЧАНИЕ:

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

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

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

0
ответ дан 22 May 2018 в 21:16

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

Поместите это в цикл

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

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

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

-4
ответ дан 22 May 2018 в 21:16
  • 1
    Положить что в петлю? На самом деле вы не предоставляете какую-либо команду здесь. – terdon♦ 22 June 2017 в 16:06
  • 2
    @terdon См. редактирование, но также обратите внимание, что я здесь, чтобы дать ответ, а не закодировать все это. Я не занимаюсь домашними заданиями других людей :) – don.joey 22 June 2017 в 16:07
  • 3
    В этом случае, пожалуйста, не отправляйте ответы и ответы. которые даже не пытаются фактически дать ответ и дают только первое приближение только для одного из многих необходимых шагов. И откуда вы знаете, что дата всегда является 17-м полем первой строки? Как OP возьмет это, чтобы переименовать свой файл? Давай. Либо ответьте на вопрос, либо нет. – terdon♦ 22 June 2017 в 16:09
  • 4
    Не согласился, поэтому я с гордостью возьму это низшее. OP может не знать о доступных инструментах командной строки и указывать его / ее на них: cut, date и loop for. Работа выполнена. – don.joey 22 June 2017 в 16:10
  • 5
    Кроме того, @terdon, если дата не всегда находится в одном столбце, то это совершенно другой вопрос. Это является ответом . – don.joey 22 June 2017 в 16:12

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

Поместите это в цикл

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

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

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

-4
ответ дан 18 July 2018 в 11:14

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

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.

ПРИМЕЧАНИЕ:

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

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

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

0
ответ дан 18 July 2018 в 11:14

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

Поместите это в цикл

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

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

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

-4
ответ дан 24 July 2018 в 19:45
  • 1
    Положить что в петлю? На самом деле вы не предоставляете какую-либо команду здесь. – terdon♦ 22 June 2017 в 16:06
  • 2
    @terdon См. редактирование, но также обратите внимание, что я здесь, чтобы дать ответ, а не закодировать все это. Я не занимаюсь домашними заданиями других людей :) – don.joey 22 June 2017 в 16:07
  • 3
    В этом случае, пожалуйста, не отправляйте ответы и ответы. которые даже не пытаются фактически дать ответ и дают только первое приближение только для одного из многих необходимых шагов. И откуда вы знаете, что дата всегда является 17-м полем первой строки? Как OP возьмет это, чтобы переименовать свой файл? Давай. Либо ответьте на вопрос, либо нет. – terdon♦ 22 June 2017 в 16:09
  • 4
    Не согласился, поэтому я с гордостью возьму это низшее. OP может не знать о доступных инструментах командной строки и указывать его / ее на них: cut, date и loop for. Работа выполнена. – don.joey 22 June 2017 в 16:10
  • 5
    Кроме того, @terdon, если дата не всегда находится в одном столбце, то это совершенно другой вопрос. Это является ответом . – don.joey 22 June 2017 в 16:12

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

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.

ПРИМЕЧАНИЕ:

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

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

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

0
ответ дан 24 July 2018 в 19:45

Другие вопросы по тегам:

Похожие вопросы: