Perl Script для поиска и замены в файле запросов .SQL с пользовательским вводом - PullRequest
1 голос
/ 02 июня 2010

У меня есть файл .SQL, содержащий большое количество запросов. Они работают с базой данных, содержащей данные по нескольким штатам за несколько лет. Машина, на которой я работаю, может обрабатывать запросы только для одного состояния за один год.

Я пытаюсь создать сценарий Perl, который принимает пользовательский ввод для сокращения состояния, номера идентификатора состояния и года. Затем он создает каталог для этого штата и года. Затем он открывает «базовый» файл .SQL, выполняет поиск и заменяет идентификатор и год базового состояния на введенные пользователем данные и сохраняет этот новый файл .SQL в созданный каталог.

Текущий скрипт, который у меня есть (ниже), останавливается на

open(IN,'<$infile')

с

"Can't open [filename]"

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

$path

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

 #!/usr/local/bin/perl

use Cwd;
$path = getcwd();
#Cleans up the path
$path =~ s/\\/\//sg;

#User inputs
print "What is the 2 letter state abbreviation for the state? Ex. 'GA'\n";
$stlet = <>;
print "What is the 2 digit state abbreviation for the state? Ex. '13'\n";
$stdig = <>;
print "What four-digit year are you doing the calculations for? Ex. '2008'\n";
$year = <>;

chomp $stlet;
chomp $stdig;
chomp $year;

#Creates the directory
mkdir($stlet);
$new = $path."\/".$stlet;
mkdir("$new/$year");

$infile = '$path/Base/TABLE_1-26.sql';
$outfile = '$path/$stlet/$year/TABLE_1-26.sql';

open(IN,'<$infile') or die "Can't open $infile: $!\n";
open(OUT,">$infile2") or die "Can't open $outfile: $!\n";
print "Working...";

while (my $search = <IN>) {
chomp $search;
$search =~ s/WHERE pop.grp  = 132008/WHERE pop.grp  = $stdig$year/g;

print OUT "$search\n";  
}
close(IN);

close(OUT);

Я знаю, что мне, вероятно, тоже нужно немного подправить регулярное выражение, но я пытаюсь брать вещи по одному. Это мой первый Perl-скрипт, и я действительно не смог найти ничего такого, что бы обрабатывало .SQL-файлы, такие, какие я могу понять.

Спасибо!

1 Ответ

2 голосов
/ 02 июня 2010
$infile = '$path/Base/TABLE_1-26.sql';

Строка в этой строке заключена в одинарные кавычки, поэтому $path не будет интерполироваться, поэтому ваша программа ищет файл с буквальным именем $path/Base/TABLE_1-26.sql.

Вы хотите

$infile = "$path/Base/TABLE_1-26.sql";

Или, лучше,

use File::Spec;
....
$infile = File::Spec->catfile($path, 'Base', 'TABLE_1-26.sql');

и аналогично для $outfile - или это $infile2? :) Я бы настоятельно рекомендовал поместить use strict; и use warnings; в начало этого и ваших будущих сценариев.

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