Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
HMP
HV vaatleja
HMP

liitunud: 15.01.2005




sõnum 19.06.2008 17:57:39 Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 19.06.2008 20:54:48 Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
HMP
HV vaatleja
HMP

liitunud: 15.01.2005




sõnum 11.07.2008 21:13:17 Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 12.07.2008 15:31:02 Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
HMP
HV vaatleja
HMP

liitunud: 15.01.2005




sõnum 13.07.2008 00:40:48 Re: Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 13.07.2008 18:20:17 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
HMP
HV vaatleja
HMP

liitunud: 15.01.2005




sõnum 14.07.2008 10:25:57 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Tühjad read, tühi muutuja, erimärgid ja UTF8 Perlis
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.