praegune kellaaeg 22.06.2025 12:24:50
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
HMP
HV vaatleja

liitunud: 15.01.2005
|
19.06.2008 17:57:39
Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis |
|
|
Tere!
Olen hädas perliga. Kuna tegemist esimese programmiga, siis pole ka imestada. Programm peab tegema järgnevat:
1. Eemaldama failist kõik tühjad read
2. Poolitama failist loetud rea TAB klahvi kohast (tekib kaks osa)
3. Kontrollima et teine osa poleks tühi (tekib veateade 5. punktiga)
4. Kuna fail on UTF8 peaks ta olema nii, et täppidega tähed oleks korralikult nähtavad (äöõüÄÖÕÜ) mitte UTF8
5. Kuna ridades võib esinda erimärke ´ ` ' jm. siis need tuleb escapeda (kuidas seda nimetataksegi)
6. Nüüd tuleb need kaks osa ilusti keasti MySQL baasi lisada
Hetkel valmis kirjutatud kood näeb välja alljärgnev:
#!/usr/bin/perl
use FileHandle;
use strict;
use warnings;
use Mysql;
use Encode;
use utf8;
# CONFIG VARIABLES
my $host = "localhost";
my $database = "minuandmebaas";
my $tablename = "minutabel";
my $user = "minukasutaja";
my $pw = "minuparool";
my $connect = Mysql->connect($host, $database, $user, $pw);
# Tühjendame andmbaasi
my $myquery = "TRUNCATE TABLE ajutine";
my $execute = $connect->query($myquery);
my $file = 'logifail.log';
open(INFO, "<$file");
while (my $txt = <INFO>) {
chomp($txt);
# Poolitame loetud rea TAB klahvist
my @osad = split(chr(9),$txt);
my $teine = quotemeta($osad[1]);
my $esimene = quotemeta($osad[0]);
my $myquery = "INSERT INTO $tablename SET esimene='$esimene', teine='$teine'";
my $execute = $connect->query($myquery);
}
close(INFO);
|
Antud programmil on probleemiks eelpool mainitud punktidest järgnevad asjad: 1, 3, 4 ja 5 punkt. Oskab keegi antud asjaga aidata?
_________________ Ma küsisin midagi? Järelikult on endal juhe kokku jooksunud, ehk juhe.ee |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
19.06.2008 20:54:48
Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis |
|
|
1. Eemaldama failist kõik tühjad read
Ilmselt pead kasutama regulaaravaldist, kontrollimaks, kas rida on tühi. Näiteks:
if ( $text =~ /^\s*$/ ) print "rida on tühi."; |
2. Poolitama failist loetud rea TAB klahvi kohast (tekib kaks osa)
Sul on kasutatud split(chr(9),$txt);, loetavam oleks: split("\t",$txt);
3. Kontrollima et teine osa poleks tühi (tekib veateade 5. punktiga)
Vaata vastust esimesele küsimusele.
4. Kuna fail on UTF8 peaks ta olema nii, et täppidega tähed oleks korralikult nähtavad (äöõüÄÖÕÜ) mitte UTF8
Perl saab UTF8 formaadis sisendiga iseseisvalt hakkama. Sina oled küll deklareerinud use utf8; kuid see pole ilmselt see mida sa tahad. See direktiiv tähendab hoopis seda, et nüüd saad sa oma programmis kasutada muutujate ja funktsioonide nimedes täpitähti. Näiteks $säärane_muutuja;. Samuti pole sul ilmselt tarvis kasutada Encode moodulit.
Küll aga võib tarvis olla MySQL-le öelda, et sisend saab olema UTF8 formaadis. Enamasti aitab SET names utf8
5. Kuna ridades võib esinda erimärke ´ ` ' jm. siis need tuleb escapeda (kuidas seda nimetataksegi)
Seda nimetatakse varjestamiseks. Kuid seda on parem lasta andmebaasiliidesel endal teha. Sinul on millegipärast kasutuses Mysql moodul, mille kohta CPAN'is öeldakse, et see on iganenud ja ärge seda kasutage. Parem variant on DBI. Sel juhul teed lihtsalt nii:
$mysql->do("INSERT INTO $tablename VALUES (?, ?)", $esimene, $teine); |
6. Nüüd tuleb need kaks osa ilusti kenasti MySQL baasi lisada
Vaata eelmist punkti.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
HMP
HV vaatleja

liitunud: 15.01.2005
|
11.07.2008 21:13:17
Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis |
|
|
nene kirjutas: |
5. Kuna ridades võib esinda erimärke ´ ` ' jm. siis need tuleb escapeda (kuidas seda nimetataksegi)
Seda nimetatakse varjestamiseks. Kuid seda on parem lasta andmebaasiliidesel endal teha. Sinul on millegipärast kasutuses Mysql moodul, mille kohta CPAN'is öeldakse, et see on iganenud ja ärge seda kasutage. Parem variant on DBI. Sel juhul teed lihtsalt nii:
$mysql->do("INSERT INTO $tablename VALUES (?, ?)", $esimene, $teine); |
|
Vabandan et selle vana teema uuesti ülesse võtsin, kuid olen jõudnud kaugemale, kuid ikka on probleem varjestamisega. Kood on ilmselt rohmakas, aga kõik muud lisab nii baasi nagu vaja välja arvatud varjestamata tekstid. Parandusettepanekud on ka oodatud.
#!/usr/bin/perl
use FileHandle;
use strict;
use warnings;
# Andmbaasiks
use DBI;
use DBD::mysql;
my $host = "localhost";
my $database = "ANDMEBAAS";
my $tablename = "TABELINIMI";
my $user = "USERNAME";
my $pw = "PAROOL";
my $dsn = "dbi:mysql:$database:localhost:3306";
my $DBIconnect = DBI->connect($dsn,$user,$pw) or die "Viga: $DBI::errstr\n";
my $esimene = "";
my $teine = "";
my $file = "logifail.log";
open(INFO, "<$file");
while (my $txt = <INFO>) {
if($txt =~ /^\s*$/) {
# print "TYHI RIDA\n";
} else {
my @osad = split("\t",$txt);
$esimene = $osad[0];
# print "$esimene ";
if(!$osad[1]) {
$teine = 0;
# print "$teine\n";
} else {
$teine = $osad[1];
# print "$teine\n";
}
if(!$teine) {
# print "Muutuja tuhi";
} else {
my $query_handle = $DBIconnect->prepare("INSERT INTO ajutine SET esimene='$esimene', teine='$teine'");
$query_handle->execute();
}
}
}
$DBIconnect->disconnect();
|
_________________ Ma küsisin midagi? Järelikult on endal juhe kokku jooksunud, ehk juhe.ee |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
12.07.2008 15:31:02
Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis |
|
|
Selle asemel, et kirjutada ise muutujad otse päringustringi sisse, nagu sa teinud oled:
my $query_handle = $DBIconnect->prepare("INSERT INTO ajutine SET esimene='$esimene', teine='$teine'");
$query_handle->execute(); |
Peaksid SQL-is kasutama hoopis kohahoidjaid (küsimärgid), ning seejärel alles päringu käivitamisel andma sellele ette väärtused, mis siis pannakse DBI poolt küsimärkide asemele ja kui vaja, siis ka varjestatakse:
my $query_handle = $DBIconnect->prepare("INSERT INTO ajutine SET esimene=?, teine=?");
$query_handle->execute($esimene, $teine); |
Ülaloleva koodi saad kirjutada ka ühe reaga:
$DBIconnect->do("INSERT INTO ajutine SET esimene=?, teine=?", $esimene, $teine); |
Soovitaksingi sul seda lühemat varianti kasutada. Mõnikord võib olla hea kutsuda prepare() ja execute() ka käsitsi välja, et valmistada üks päring tsükli alguses ette ja siis seda korduvalt tsükli sees erinevate argumentidega välja kutsuda, kuid see on rohkem optimeerimise teema ja ilmselt ei anna sulle olulist võitu enne, kui sul tabelitesse miljoneid kirjeid pole tarvis lisada.
See asi kah, et $DBIconnect on natuke kohmakas muutujanimi, sest ta väljendab mingit tegevust (ühendumist), parem oleks kui ta väljendaks mingit asja/objekti, näiteks $connection (ühendus) või $db (viimane on vist üldse levinuim nimetus andmebaasiühenduse objektile).
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
HMP
HV vaatleja

liitunud: 15.01.2005
|
13.07.2008 00:40:48
Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis |
|
|
nene kirjutas: |
Peaksid SQL-is kasutama hoopis kohahoidjaid (küsimärgid), ning seejärel alles päringu käivitamisel andma sellele ette väärtused, mis siis pannakse DBI poolt küsimärkide asemele ja kui vaja, siis ka varjestatakse:
my $query_handle = $DBIconnect->prepare("INSERT INTO ajutine SET esimene=?, teine=?");
$query_handle->execute($esimene, $teine); |
Ülaloleva koodi saad kirjutada ka ühe reaga:
$DBIconnect->do("INSERT INTO ajutine SET esimene=?, teine=?", $esimene, $teine); |
See asi kah, et $DBIconnect on natuke kohmakas muutujanimi, sest ta väljendab mingit tegevust (ühendumist), parem oleks kui ta väljendaks mingit asja/objekti, näiteks $connection (ühendus) või $db (viimane on vist üldse levinuim nimetus andmebaasiühenduse objektile). |
Tänan, lõpuks ometi sai asja toimima nii nagu vaja. Ise ma selle lahenduse peale poleks vist jõudnud. Google abiga nägin ka neid kohahoidjaid (küsimärke), kuid ma ei saanud sellest aru. Harjunud kõik otse kirjutama. Tõsi, sellel lühemal variandil andis vea, kuid sellele eelnev variant toimib.
Veaks või hoiatuseks andis järgneva rea:
DBI::db=HASH(0x927df6c)->do(...): attribute parameter 'juuli 28 16:50:18 *' is not a hash ref at ./test.pl line 43, <INFO> line 3. |
Nii see rida seal failis tõesti algab juuli 28 16:50:18 * aga sellele eelneb tühi rida ja sellele eelnevat rida ka ei kasutata. Rida #43 ongi $DBIconnect->do(.....
_________________ Ma küsisin midagi? Järelikult on endal juhe kokku jooksunud, ehk juhe.ee |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
13.07.2008 18:20:17
|
|
|
Paistab, et teise atribuudina tahab DBI assoc-massiivi draiveri-spetsiifilise infoga. Selle saame jätta defineerimata kirjutades selle asemele undef, seega:
$DBIconnect->do("INSERT INTO ajutine SET esimene=?, teine=?", undef, $esimene, $teine); |
Natukene kohmakas on see undef sinna vahele toppida, aga parem ikka kui eraldi prepare ja execute.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
HMP
HV vaatleja

liitunud: 15.01.2005
|
14.07.2008 10:25:57
|
|
|
nene kirjutas: |
Paistab, et teise atribuudina tahab DBI assoc-massiivi draiveri-spetsiifilise infoga. Selle saame jätta defineerimata kirjutades selle asemele undef, seega:
$DBIconnect->do("INSERT INTO ajutine SET esimene=?, teine=?", undef, $esimene, $teine); |
Natukene kohmakas on see undef sinna vahele toppida, aga parem ikka kui eraldi prepare ja execute. |
Tänan, nüüd toimib ka lühike variant. Online juhendites ja näidetes nägin sõna DEFAULT. Proovisin ka seda aga see ei toimingud.
_________________ Ma küsisin midagi? Järelikult on endal juhe kokku jooksunud, ehk juhe.ee |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|