Сценарий для получения данных из файла csv и выполнения связанных операций в базе данных

Я новичок в мире сценариев оболочки и не очень разбираюсь в сценариях оболочки. Моя работа требует, чтобы я написал сценарий, который отображает номера телефонов из списка записей, хранящихся в файле CSV.

Для каждого номера телефона он ищет в таблице пользователей в базе данных, и если совпадение найдено, оно обновляет колонку номера телефона, добавляя «A2B1» перед номером телефона.

Например, если найдена запись в базе данных для номера телефона типа «456789» в файле csv, содержащем записи, то столбец телефонных номеров будет обновлен как «A2B1 456789».

Я подумал о следующем способе сделать это: сначала я буду использовать команду «cut», чтобы взять второй столбец из каждой строки файла CSV. (Тем не менее, я не знаю, как сохранить значение во втором столбце в каждой строке переменной, чтобы я мог использовать его в запросе SQL-запроса.) Создайте ссылку db и напишите инструкцию / запрос SQL-запроса ,

Затем, если какая-либо запись будет возвращена, а затем будет обновлена ​​установка, упомянутая выше.

Я не знаю, как это сделать или писать на языке оболочки. Я пытался думать о способе передачи вывода запроса в файл и проверить, равен ли размер файла нулю, и если он не принимает переменную в файле (который является номером записи / телефона), возвращаемым запросом, затем сохраните его в переменной и выполните операцию обновления, но я сомневаюсь, что это было бы хорошим способом, и, кроме того, учитывая мое двухдневное детство в этой области, я не уверен в синтаксис тоже. С нетерпением жду вашей помощи

  • Вывод NamingVariable для нескольких файлов в сценарии Bash
  • Как я могу объединить два файла foo1 и foo2, но также добавить текст после foo1 и до foo2 с терминала?
  • Как читать пользовательский ввод строки за строкой до Ctrl + D и включать строку, в которой набирается Ctrl + D
  • Извлечение данных между двумя сопоставленными шаблонами в двоичном файле
  • Cygwin, bash, изменить переменную окружающей среды?
  • Как я могу ответить на приглашение в сценарии оболочки, работающем в фоновом режиме?
  • Как использовать printf для отображения результатов расчета?
  • Как скопировать стандартный вывод и стандартную ошибку в журнал?
  • 2 Solutions collect form web for “Сценарий для получения данных из файла csv и выполнения связанных операций в базе данных”

    Вы можете использовать этот скрипт:

     #!/bin/bash PREFIX="A2B1 " TABLE="sqltablename" COLUMN="sqlcolumnname" if [[ ! -r "$1" ]]; then echo "unable to read file '$1'" exit 1 fi cut -d, -f2 "$1" | while read phonenum; do newnum="$PREFIX $phonenum" echo "UPDATE $TABLE SET $COLUMN = '$newnum' WHERE $COLUMN = '$phonenum';" done 

    Это произойдет, если вы запустите его с вашим CSV-файлом в качестве параметра (например ./script.sh /path/to/mydata.csv ), выведите серию операторов SQL, которые будут обновлять данные по мере их описания. Измените сценарий, чтобы использовать правильное имя таблицы и столбца.

    После того, как вы подтвердите, что он дает нужные вам утверждения, вы можете передать его в ваш SQL-движок по выбору или сохранить вывод в файл SQL, который вы можете выполнить, но вы предпочитаете использовать ./script.sh /path/to/mydata.csv > /path/to/updatephonenumbers.sql .

    Хотя вы можете выполнять mysql запросы / обновления / etc в сценарии оболочки, гораздо проще использовать язык (например, perl или python ) с хорошей поддержкой как для баз данных, так и для файлов CSV.

    Вот один из способов сделать это в perl , используя модуль perl DBI модули DBD::CSV и DBD::mysql .

    Он читает каждую строку из вашего CSV-файла (я назвал его «updates.csv» и предположил, что имя столбца является phonenum ) и выдает команды SQL UPDATE для таблицы users базы данных dbname в mysql. Измените имя dbname в соответствии с вашей базой данных.

    ПРИМЕЧАНИЕ. Следующий код не проверен, но он должен работать. Поскольку это непроверено, возможно, я сделал несколько опечаток или другие ошибки.

    Я настоятельно рекомендую сначала тестировать его на COPY вашей базы данных, а не сразу запускать его на реальных данных. На самом деле, ВСЕГДА хорошая идея проверить свой код на копии реальных данных, независимо от того, что вы пишете, или на каком языке вы его пишете.

     #! /usr/bin/perl use strict; use DBI; ### ### variables setup ### # DBD::CSV treats all .csv files in this dir as tables. # ie this directory is the "database" and the .csv files # are the tables in that database. my $csv_dir = '/path/to/csv/dir'; my $csv_db = 'updates'; # corresponds to "$csv_dir/updates.csv" my $m_db = 'dbname'; # replace with your mysql database name my $m_user = 'username'; my $m_pass = 'password'; my $m_host = 'localhost'; my $m_port = '3306'; my $m_dsn = "DBI:mysql:database=${m_db};host=${m_host};port=${m_port}"; ### ### database handle setup ### # database handle for CSV connection my $c_h = DBI->connect ("DBI:CSV:", undef, undef, { f_ext => ".csv/r", f_dir => $csv_dir, RaiseError => 1, }) or die "Cannot connect: $DBI::errstr"; # database handle for mysql connection my $m_h = DBI->connect($m_dsn, $m_user, $m_pass, { PrintError => 0 }); ### ### all set up, time to do some work. ### # NOTE: this script assumes that the .csv file contains a header line with # the field names as the first line of the file. # # If not, the easiest thing to do is edit it with your preferred text # editor and add one. Otherwise, see `man DBD::CSV` to find out how to # specify field names. # # or EDIT and uncomment the following three lines of code: #$c_h->{csv_tables}{$csv_db} = { # col_names => [ qw(column1 phonenum column3 column4 ...) ]; #}; # prepare statement handle for csv db query using a placeholder ? for the # column name. my $c_sth = $c_h->prepare("select phonenum from ?"); # and execute it. later, we'll use a forech loop to read the data returned $c_sth->execute($csv_db); # prepare the SQL statement for the mysql db using placeholders ? for # the values. this assumes that the column/field name is also called # 'phonenum' in mysql. These placeholders are invaluable, they automaticaly # quote any data that needs to be quoted (eg strings) while not quoting # things that shouldn't be quoted (eg integers). They prevent a huge # range of common mistakes. # # prepare it once, execute it multiple times with different values. my $m_sth = $m_h->prepare('UPDATE users SET phonenum = ? WHERE phonenum = ?'); $m_h->begin_work; # begin transaction foreach ($c_sth->fetchrow_array) { chomp; my $newphone = "A2B1 $_"; $m_sth = $m_sth->execute($newphone, $_); }; $m_h->commit; # commit transaction ### ### we're done. finish the statement handles and disconnect from ### the databases. ### $c_sth->finish; $m_sth->finish; $c_h->disconnect; $m_h->disconnect; 

    Он выглядит длиннее обычного сценария быстрой оболочки, но большая часть кода – это просто переменная и настройка дескриптора базы данных (и этот код установки может быть повторно использован в других похожих сценариях). Фактический код, выполняющий работу (исключая комментарии), составляет только около полудюймовых строк.

    Linux и Unix - лучшая ОС в мире.